2011-04-22 9 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

を読んでみてください。 –

+2

私はいくつかの場所で 'typename'がないと思います。しかし、集中するのも疲れました。私は他の誰かにそれを残すでしょう。しかし、私はあなたの質問のいくつかの部分を言い換えるべきだと思います。今から1年後に誰かが質問と回答を見つけたとします。あなたの欲求不満は長くなくなります。滞在する言葉。 – 0xC0000022L

+1

いい質問...このような複雑なタイプのテンプレートを見たことはありません! – iammilind

答えて

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

、名前はテンプレートを参照することが知られている必要があります。

メンバテンプレートの特殊化の名前が後に表示されるとき。 postfix-expressionまたはqualified-idのネストされた名前指定子の後に - >があり、postfix-expressionまたはqualified-idがテンプレートパラメータ(14.6.2)に明示的に依存する場合、メンバテンプレート名はキーワードテンプレートの接頭辞。それ以外の場合は名前が非テンプレート

Tに名前を付けるために仮定されたテンプレートパラメータTAに依存して、ネストされた名指定子D<TA>後に表示されます。構造体D<TA>::T<TBA>は、クラステンプレートの名前としてTと解釈する必要があります。したがって、templateキーワードは、その時点で標準によって義務づけられています。

7

クランのエラーメッセージがもう少し便利です。詳細については

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

は、問題を記述するためにあなたの質問のタイトルをしてください修正スタックオーバーフローC++よくある質問"Where and why do I have to put “template” and “typename” on dependent names?"

+1

+1についてはClang参照) – 0xC0000022L

関連する問題