有人能帮我在C++模板中使用嵌套的名称说明符吗

Can someone help me with nested-name specifiers in C++ templates?

本文关键字:嵌套 说明符 C++      更新时间:2023-10-16

下面的示例代码有什么问题?它不在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

Clang的错误消息更有帮助:

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

有关更多信息,请考虑阅读堆栈溢出C++常见问题解答"我必须在依赖名称上放置"template"answers"typename"的位置和原因?">

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

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

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

T出现在依赖于模板参数TA的嵌套名称说明符D<TA>之后。构造D<TA>::T<TBA>必须将T解释为类模板的名称,因此template关键字在这一点上是Standard强制要求的。