我有一个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?
答案 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
的指针和引用。