依存スコープを持つネストされたテンプレート


79

依存スコープとは何ですか?次のエラーのコンテキストでのtypenameの意味は何ですか?

$ make
g++ -std=gnu++0x main.cpp
main.cpp:18:10: error: need 'typename' before 'ptrModel<std::vector<Data> >::Type' because 'ptrModel<std::vector<Data> >' is a dependent scope
make: *** [all] Error 1


/*
 * main.cpp
 */

#include <vector>
#include <memory>

template<typename T>
struct ptrModel
{
 typedef std::unique_ptr<T> Type;
};


template<typename Data>
struct ptrType
{
 typedef ptrModel< std::vector<Data> >::Type Type;
};

int main()
{
 return 0;
}

回答:


124

コンパイラは正確に何をすべきかを教えてくれました。そのようtypenameptrModel<std::vector<Data> >::Type、前に書いてください:

 typedef typename ptrModel<std::vector<Data> >::Type Type;

この要件の理由は、コンパイラーがこの時点でptrModel<std::vector<Data> >::Typeメンバー変数を記述しているかネストされた型を記述しているかを認識していないためです。それができていなくても数字というの定義を見ることによって、外ptrModelの専門があるかもしれないので、ptrModelためstd::vector<Data>それはこれらの事で、まだその変化に得ていないことをプログラム内のどこか::Typeを指します。したがって、明示的に伝える必要があります。

この名前ptrModel<std::vector<Data> >::Typeは、テンプレートのインスタンス化に依存するスコープ内にあるため、「依存スコープ」を持っています。


6
了解しましたが、メンバー変数をtypedefするのは意味がないというのは本当ではありませんか?
user383352 2010

5
はい。ただし、コンパイラによるテンプレートの解析方法に関する詳細があるため、必ずしも役立つとは限りません。この質問に対する受け入れられた回答を参照してください:stackoverflow.com/questions/642229/…–
Tyler McHenry

5
また、このエラーと概念に初めて遭遇したときに、この回答が非常に役立つことがわかりました。
ドリューノアケス2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.