1. ホーム
  2. c++

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

2023-08-02 22:38:13

質問

以下のエラーの文脈で、従属スコープとは何か、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;
}

どのように解決するのですか?

コンパイラは何をすべきか正確に教えてくれました。書く typename の前に ptrModel<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 は従属スコープを持っています。 依存する というのは、テンプレートのインスタンス化にしているスコープにあるからです。