2011-04-22 60 views
2

下面的示例代码有什么问题?它不能在GCC中编译。为什么?有人可以帮助我在C++模板中使用嵌套名称说明符吗?

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 
+0

解决您的问题的标题来描述问题,请。 – 2011-04-22 04:12:40

+2

我猜''typename'在某个地方缺少。虽然太累了,但集中精力。我会把它留给别人。但我认为你应该改写你的问题的一些部分。想象一下,从现在开始的一年内,有人会发现问题和答案。你的沮丧将很快消失。留下的话。 – 0xC0000022L 2011-04-22 04:13:04

+1

不错的问题...从来没有见过这种复杂的类型模板! – iammilind 2011-04-22 05:59:30

回答

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

对于模板的名称由模板参数进行明确限定,该名称必须已知是指一个模板。

当成员模板专门名称出现后。或 - 在后缀表达式中,或者在限定id中的嵌套名称说明符之后,并且postfix-expression或qualified-id显式依赖于模板参数(14.6.2),则成员模板名称必须是由关键字模板作为前缀。否则,则假定名称来命名一个非模板

T嵌套的名称说明符D<TA>这取决于模板参数TA后出现。构造D<TA>::T<TBA>必须将T解释为类模板的名称,因此template关键字由标准在此时强制执行。

相关问题