模板实例化的原型?

Prototype for template instantiation?

本文关键字:原型 实例化      更新时间:2023-10-16

我有一个类型VertexContainer它是一个typedef的实例化模板:

// in a header, included into cpp
class Vertex {/*...*/};
typedef DataVector<Vertex> VertexContainer;
class SomeOtherClass;

我想在标题中使用VertexContainer,而不拉入可能的定义。是否可以为其创建一个"原型"(如类声明(?

// in header
class VertexContainer;  // <-- this doesnt work
class SomeOtherClass;
SomeHandle<SomeOtherClass> handle1;   // this works
SomeHandle<VertexContainer> handle2;  // how to prototype VertexContainer?

使用 GCC,我得到类似于以下内容的错误:

error: using typedef-name 'VertexContainer' after 'class'
class VertexContainer;
(...)
note: 'VertexContainer' has a previous declaration here
typedef DataVector< Vertex > VertexContainer;
^~~~~~~~~~~~~~~`

对于权威答案,您应该提供更多上下文,但通常,如果将以下内容单独放在标头中,则会编译以下内容:

template<typename T> class DataVector;
class Vertex;
typedef DataVector<Vertex> VertexContainer;

您需要转发声明模板和类。但是,当您到达此处时:

SomeHandle<VertexContainer> handle2; 

模板和可能的类(取决于模板如何使用类(都需要完全定义。如果没有问题中的其他上下文,就无法确定这一点。

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

此外:

class VertexContainer;

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

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

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

因此,如果您不想拉入声明,则只允许在DataVector中使用指向Vertex的指针和引用。