具有相关范围的嵌套模板


80

在以下错误的上下文中,从属范围是什么,类型名的含义是什么?

$ 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;
}

Answers:


124

编译器告诉您确切的操作。像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具有“从属范围”,因为它在依赖于模板实例化的范围内。


6
好的,但这不是真的,对一个成员变量进行typedef没有意义吗?
user383352

5
是的,但是由于有关编译器如何解析模板的一些细节,因此不一定有帮助。请参阅对此问题的公认答案:stackoverflow.com/questions/642229/…–
泰勒·麦克亨利

5
当初次遇到此错误和概念时,我也发现此答案非常有帮助。
Drew Noakes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.