具有依赖范围的嵌套模板

use*_*352 79 c++ templates scope nested

什么是依赖范围以及在以下错误的上下文中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;
}
Run Code Online (Sandbox Code Playgroud)

Tyl*_*nry 123

编译器告诉你到底要做什么.写typename之前ptrModel<std::vector<Data> >::Type,像这样:

 typedef typename ptrModel<std::vector<Data> >::Type Type;
Run Code Online (Sandbox Code Playgroud)

此要求的原因是编译器此时不知道是ptrModel<std::vector<Data> >::Type描述成员变量还是嵌套类型.它甚至不能明白这一点通过查看的定义ptrModel,因为有可能是一个专业化ptrModelstd::vector<Data>,因为它没有得到对尚未从而改变它的这些东西的程序别的地方::Type指.所以你需要明确告诉它.

该名称ptrModel<std::vector<Data> >::Type具有"依赖范围",因为它位于取决于模板实例化的范围内.

  • 好吧,但是不是这样,键入一个成员变量是没有意义的吗? (6认同)
  • 是的,但由于编译器如何解析模板的一些细节,这并不一定有帮助.请参阅此问题的已接受答案:http://stackoverflow.com/questions/642229/why-do-i-need-to-use-typedef-typename-in-g-but-not-vs (5认同)
  • 我还发现[这个答案](http://stackoverflow.com/a/6571836/24874)在第一次遇到这个错误和概念时非常有帮助. (5认同)