依存スコープとは何ですか?また、次のエラーのコンテキストでの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;
}
コンパイラは、何をすべきかを正確に教えてくれました。 ptrModel<std::vector<Data> >::Type
の前にtypename
と書いてください。
typedef typename ptrModel<std::vector<Data> >::Type Type;
この要件の理由は、ptrModel<std::vector<Data> >::Type
がメンバー変数またはネストされた型のどちらを記述するかをコンパイラーがこの時点で知らないことです。 ptrModel
の定義を見ても、std::vector<Data>
のptrModel
の特殊化があるかもしれないので、プログラム内のまだどこにも到達していないことがわかりません。これらは::Type
が参照するものを変更します。そのため、明示的に伝える必要があります。
名前ptrModel<std::vector<Data> >::Type
には、テンプレートのインスタンス化によってdependsのスコープ内にあるため、「依存スコープ」があります。