模板实例化的原型?

jdm*_*jdm 2 c++ templates

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

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

class SomeOtherClass;
Run Code Online (Sandbox Code Playgroud)

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

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

SomeHandle<SomeOtherClass> handle1;   // this works
SomeHandle<VertexContainer> handle2;  // how to prototype VertexContainer?
Run Code Online (Sandbox Code Playgroud)

使用GCC我得到类似于的错误:

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

Sam*_*hik 5

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

template<typename T> class DataVector;
class Vertex;

typedef DataVector<Vertex> VertexContainer;
Run Code Online (Sandbox Code Playgroud)

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

SomeHandle<VertexContainer> handle2; 
Run Code Online (Sandbox Code Playgroud)

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

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

此外:

class VertexContainer;
Run Code Online (Sandbox Code Playgroud)

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