有人可以帮助我使用 C++ 中的嵌套名称说明符吗?模板?

发布于 2024-11-02 16:36:08 字数 590 浏览 0 评论 0原文

下面的示例代码有什么问题?它不能在 GCC 中编译。为什么?

template <class TA>
struct A
{
    template <class TAB> struct B;
};

template <class TC>
struct C {};


template <class TD>
struct D
{
    template <class TTD> class T {};
};    

template<class TA>
template<class TBA>
struct A<TA>::B : C<typename D<TA>::T<TBA> >
{
    int foo;
};

GCC 4.3.4 输出:

error: template argument 1 is invalid
error: expected `{' before ‘>’ token
error: expected unqualified-id before ‘>’ token

What's wrong with the following sample code? It doesn't compile in GCC. Why?

template <class TA>
struct A
{
    template <class TAB> struct B;
};

template <class TC>
struct C {};


template <class TD>
struct D
{
    template <class TTD> class T {};
};    

template<class TA>
template<class TBA>
struct A<TA>::B : C<typename D<TA>::T<TBA> >
{
    int foo;
};

GCC 4.3.4 output:

error: template argument 1 is invalid
error: expected `{' before ‘>’ token
error: expected unqualified-id before ‘>’ token

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

所谓喜欢 2024-11-09 16:36:08

Clang 的错误消息更有帮助:

error: use 'template' keyword to treat 'T' as a dependent template name
struct A<TA>::B : C<typename D<TA>::T<TBA> >
                                    ^
                                    template

有关更多信息,请考虑阅读 Stack Overflow C++ 常见问题解答 “我必须在何处以及为什么必须将“template”和“typename”放在依赖名称上?”

Clang's error message is a bit more helpful:

error: use 'template' keyword to treat 'T' as a dependent template name
struct A<TA>::B : C<typename D<TA>::T<TBA> >
                                    ^
                                    template

For more information consider reading the Stack Overflow C++ FAQ "Where and why do I have to put “template” and “typename” on dependent names?"

她比我温柔 2024-11-09 16:36:08
struct A<TA>::B : C<typename D<TA>::template T<TBA> >

对于由模板参数显式限定的模板名称,必须知道该名称引用模板。

当成员模板专业化的名称出现在 后时。或->在后缀表达式中,或在限定 ID 中的嵌套名称说明符之后,并且后缀表达式或限定 ID 显式依赖于模板参数 (14.6.2),成员模板名称必须以关键字模板。否则,该名称将被假定为非模板名称

T,该名称出现在嵌套名称说明符 D 后面,该说明符取决于模板参数 TA< /代码>。构造 D::T 必须将 T 解释为类模板的名称,因此必须使用 template 关键字按当时的标准。

struct A<TA>::B : C<typename D<TA>::template T<TBA> >

For a template-name to be explicitly qualified by the template arguments, the name must be known to refer to a template.

When the name of a member template specialization appears after . or -> in a postfix-expression, or after nested-name-specifier in a qualified-id, and the postfix-expression or qualified-id explicitly depends on a template-parameter (14.6.2), the member template name must be prefixed by the keyword template. Otherwise the name is assumed to name a non-template

T appears after the nested-name-specifier D<TA> which depends on the template-parameter TA. The construct D<TA>::T<TBA> must interpret T as the name of a class template and so the template keyword is mandated by the Standard at that point.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文