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
,因为有可能是一个专业化ptrModel
的std::vector<Data>
,因为它没有得到对尚未从而改变它的这些东西的程序别的地方::Type
指.所以你需要明确告诉它.
该名称ptrModel<std::vector<Data> >::Type
具有"依赖范围",因为它位于取决于模板实例化的范围内.