Nested templates with dependent scope(具有依赖范围的嵌套模板)
问题描述
在以下错误的上下文中,什么是依赖范围以及 typename 的含义是什么?
What is dependent scope and what is the meaning of typename in the context of the following error?
$ 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;
}
推荐答案
编译器会准确地告诉您要做什么.在ptrModel
,像这样:typename
;>::Type
The compiler told you exactly what to do. Write typename
before ptrModel<std::vector<Data> >::Type
, like so:
typedef typename ptrModel<std::vector<Data> >::Type Type;
这个要求的原因是编译器此时不知道 ptrModel
描述成员变量或嵌套类型.它甚至无法通过查看 ptrModel
的定义来解决这个问题,因为对于 std::vector
可能有一个专门的 ptrModel
code> 程序中尚未到达的其他地方,它更改了 ::Type
所指的内容.所以你需要明确告诉它.
The reason for this requirement is that the compiler doesn't at this point know whether ptrModel<std::vector<Data> >::Type
describes a member variable or a nested type. It can't even figure that out by looking at the definition of ptrModel
because there might be a specialization of ptrModel
for std::vector<Data>
somewhere else in the program that it hasn't gotten to yet which changes which of these things ::Type
refers to. So you need to tell it explicitly.
名称 ptrModel
有一个依赖范围",因为它位于一个依赖模板实例化的范围内.
The name ptrModel<std::vector<Data> >::Type
has a "dependent scope" because it is in a scope that depends on the instantiation of a template.
这篇关于具有依赖范围的嵌套模板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:具有依赖范围的嵌套模板


基础教程推荐
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 从 std::cin 读取密码 2021-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 使用从字符串中提取的参数调用函数 2022-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01