web-dev-qa-db-ja.com

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

依存スコープとは何ですか?また、次のエラーのコンテキストでの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;
}
79
user383352

コンパイラは、何をすべきかを正確に教えてくれました。 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のスコープ内にあるため、「依存スコープ」があります。

123
Tyler McHenry