模板实例化的原型?
Prototype for template instantiation?
我有一个类型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
的指针和引用。
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 受约束的成员函数和显式模板实例化
- 模板实例化的原型?
- 在不复制代码的情况下,从工厂实例化一个对象(如炮塔)的草稿(即原型)