具有依赖范围的嵌套模板
Posted
技术标签:
【中文标题】具有依赖范围的嵌套模板【英文标题】:Nested templates with dependent scope 【发布时间】:2011-03-19 16:55:36 【问题描述】:什么是依赖范围,在以下错误的上下文中 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;
【问题讨论】:
【参考方案1】:编译器准确地告诉了你要做什么。在ptrModel<std::vector<Data> >::Type
之前写typename
,像这样:
typedef typename ptrModel<std::vector<Data> >::Type Type;
此要求的原因是编译器此时不知道ptrModel<std::vector<Data> >::Type
是描述成员变量还是嵌套类型。它甚至无法通过查看ptrModel
的定义来弄清楚这一点,因为在程序中的其他地方可能存在ptrModel
的专用化std::vector<Data>
,它尚未到达这会改变这些事情中的哪一个::Type
指。所以你需要明确地告诉它。
名称ptrModel<std::vector<Data> >::Type
具有“依赖范围”,因为它位于依赖模板实例化的范围内。
【讨论】:
好吧,但是 typedef 一个成员变量是不是真的没有意义? 是的,但这并不一定有帮助,因为有一些关于编译器如何解析模板的细节。请参阅此问题的公认答案:***.com/questions/642229/… 我还发现this answer 在第一次遇到这个错误和概念时非常有帮助。以上是关于具有依赖范围的嵌套模板的主要内容,如果未能解决你的问题,请参考以下文章
为啥允许使用泛型 lambda 而不允许使用带有模板化方法的嵌套结构?