2017-01-08 7 views
3

私は次のような問題を持っている、入れ子になったクラスで(この場合はstruct)名前空間とタイプC++ネストされたクラスの関数の戻り値の型と名前空間

class Example 
{ 
struct Node { /* with all the methods it needs */ } 
Node * func(); 
} 

を返す今、私は外にfuncの実装を入れたいですクラス。だから私がやったことです:

Example::Node * Example::func() 
{ 
return nullptr; 
} 

と私は多くのエラーを得たexampleテンプレート

template<typename T> 
class Example {/* all the same here */} 

template <typename T> 
Example<T>::Node * Example<T>::func() 
{ 
return nullptr; 
} 

を作ったまでは、うまく働きました。それから私は、私はエラーを取得する

template <typename T> 
Example::Node * Example<T>::func() 
{ 
return nullptr; 
} 

を試してみました:私の知る限り、これは関数がその名前空間に属することを意味するのでExample<T>::func()は、正しいことを知っているように

を「クラステンプレートを使用すると、テンプレート引数リストが必要です」。しかし、私の関数の戻り値の型についてはわかりません。どんな助け?

+0

これは本当に私の質問に答えるが、私は尋ねた前に、私は 'typename'キーワードこれは本当に働い – user5692938

答えて

3

テンプレートは非テンプレートとは異なりますが、後で特殊化される可能性があります。これらの未知の特殊化では、Example<T>::Nodeは静的メンバーの名前である場合もありますが、名前がまったく存在しない場合もあります。

標準を使用すると、Exampleの静的メンバーとして、何か他の名前ではありませんExample<T>::Nodeは型の名前、テンプレートクラスExampleのすなわち、メンバーのタイプ名であるexpicitlyことを指定するtypenameを使用する必要があります。すなわち

template <typename T> 
typename Example<T>::Node * Example<T>::func() 
{ 
return nullptr; 
} 
+0

を探すために持って知りませんでしたが、あなたはそれを説明することができますか? :) – user5692938

+0

@ user5692938私はいくつかの説明を追加しました。詳細については、duplicatedと記された質問の回答を参照してください。 – songyuanyao

関連する問題