具有依赖范围的嵌套模板

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>::Type 描述成员变量或嵌套类型.它甚至无法通过查看 ptrModel 的定义来解决这个问题,因为对于 std::vector 可能有一个专门的 ptrModelcode> 程序中尚未到达的其他地方,它更改了 ::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>::Type 有一个依赖范围",因为它位于一个依赖模板实例化的范围内.

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.

这篇关于具有依赖范围的嵌套模板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How do compilers treat variable length arrays(编译器如何处理变长数组)
Deduce template argument from std::function call signature(从 std::function 调用签名推导出模板参数)
check if member exists using enable_if(使用 enable_if 检查成员是否存在)
Standard Library Containers with additional optional template parameters?(具有附加可选模板参数的标准库容器?)
Uses of a C++ Arithmetic Promotion Header(C++ 算术提升标头的使用)
Parameter pack must be at the end of the parameter list... When and why?(参数包必须位于参数列表的末尾...何时以及为什么?)