模板实例化的原型?

时间:2017-07-11 16:31:53

标签: c++ templates

我有一个package-lock.json类型,它是一个typedef实例化模板:

VertexContainer

我想在标题中使用// in a header, included into cpp class Vertex {/*...*/}; typedef DataVector<Vertex> VertexContainer; class SomeOtherClass; ,而不介绍可能的定义。是否有可能为它创建一个“原型”(如类声明)?

VertexContainer

使用GCC,我收到类似以下错误:

// in header
class VertexContainer;  // <-- this doesnt work
class SomeOtherClass;

SomeHandle<SomeOtherClass> handle1;   // this works
SomeHandle<VertexContainer> handle2;  // how to prototype VertexContainer?

2 个答案:

答案 0 :(得分:5)

对于权威性答案,您应该提供更多上下文,但一般情况下,如果将其自身放在标题中,则会编译以下内容:

template<typename T> class DataVector;
class Vertex;

typedef DataVector<Vertex> VertexContainer;

您需要向前声明模板和类。但是,当你到达这里时:

SomeHandle<VertexContainer> handle2; 

模板和可能的类(取决于模板如何使用类)都需要完全定义。如果你的问题中没有其他背景,就无法确定。

但是,纯粹作为前向声明,前向声明模板和模板参数足以定义typedef

此外:

class VertexContainer;

您在该行上的错误原因略有不同。 VertexContaner不是一个班级。它是一个typedef,一个别名。 typedef不会创建新类。它为现有类创建别名。

答案 1 :(得分:0)

模板只是代码替换的一种聪明方式。

因此,为了能够使用该类型的前向声明,与任何其他前向声明一样,您只能以某种方式使用模板化容器内部的类型,声明永远不会被知道。

因此,如果您不想引入声明,那么Vertex内只允许指向DataVector的指针和引用。