g ++模板问题

f0b*_*b0s 6 c++ templates porting g++

我正在将我的c ++ windows代码(msvc和intel)移植到Linux(g ++).代码使用了很多模板(我喜欢元编程;-).但是我无法编译这段代码:

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;
};
Run Code Online (Sandbox Code Playgroud)

g ++告诉我,在A :: B的定义中,C类具有无效的模板参数.但是在msvc和intel上运行良好!这有什么问题?PS:对不起,我无法发布原始代码,因为它太模板复杂了.但是这个例子实际上是相同的,并且在g ++上给出了相同的错误.谢谢.

更新:我发现问题出现在T. g ++的TBA参数中,并不喜欢在定义中使用第二个模板.

Joh*_*itb 10

你需要template关键字

template<class TA>
    template<class TBA>
struct A<TA>::B : C<typename D<TA>::template T<TBA> >
{
    int foo;
};
Run Code Online (Sandbox Code Playgroud)

GCC在这里给出诊断是正确的.这是因为T无法在依赖范围内查找D<TA>.<后面的含义取决于是否T是模板.标准说,T应该假定它不是模板,因此T不能跟随模板参数列表.

template就像typename它告诉编译器将其T视为模板,并且<在任何情况下它都是参数列表的开头.标准在段落14.2/2和段落中说14.2/4

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

当成员模板专业化的名称出现之后.或 - >在postfix-expression中,或在qualified-id中的nested-name-specifier之后,postfix-expression或qualified-id显式依赖于template-parameter(14.6.2),成员模板名称必须是以关键字模板为前缀.否则,假定该名称命名非模板.

在您的情况下,您T出现在D<TA>依赖于template-parameter 的嵌套名称说明符之后TA.要使typename-specifier正确解析,构造D<TA>::T<TBA>必须解释T14.2禁止的类模板的名称.


在那个主题上,尝试使用Clang进行编译总是一个好主意

main1.cpp:21:37: error: use 'template' keyword to treat 'T' as a dependent template name
struct A<TA>::B : C<typename D<TA>::T<TBA> >
                                    ^
                                    template 
1 error generated.
Run Code Online (Sandbox Code Playgroud)