C++ 包含模板的(sdk)类的转发声明
我一直在头文件中进行转发声明,并在cpp中包含实际的类文件。但是当类被模板化时,我遇到了问题:C++ 包含模板的(sdk)类的转发声明,c++,templates,forward-declaration,C++,Templates,Forward Declaration,我一直在头文件中进行转发声明,并在cpp中包含实际的类文件。但是当类被模板化时,我遇到了问题: class MyClass { public: MyClass(); void aFunction(); private: QList<int> m_member; }; 我尝试过(因为在这个特定的类中,我只需要QList整数): classqlist; 错误:“QList”在实例化后专门化 我查找了这些错误,但只发现了创建类模板有困难的人的问题,没有发现任何关于转发声明的
class MyClass {
public:
MyClass();
void aFunction();
private:
QList<int> m_member;
};
我尝试过(因为在这个特定的类中,我只需要QList
整数):
classqlist;
错误:“QList”在实例化后专门化
我查找了这些错误,但只发现了创建类模板有困难的人的问题,没有发现任何关于转发声明的问题
如果没有其他办法,我可以将#包含在头文件中并放弃转发声明-但我想了解这个问题
在最受欢迎的问题中也建议使用此选项,关于:
只需包含,不用担心
我不明白…您可以向前声明一个模板类,如下所示:
template<typename>
class QList;
模板
QList类;
但是,如果您声明的成员类型(即m_成员)不是引用或指针,那么它将不起作用。如果您希望将
QList
作为类的成员,则无论如何都需要完整的声明(因为编译器需要计算类的大小)。使用正向声明,您可以有指针或引用,但不能有更多。@BoPersson如果列表的大小未知,它怎么能做到这一点呢?QList
对象将始终具有相同的大小。列表中的int
s将被单独分配。您引用的编译器错误听起来像
,实际上已经包含在内了,所以再次包含它不会有什么坏处。哦,如果我想要这个,我的私人成员需要被引用。。。帽子会有用的。。。我是否必须将它们声明为QList*m_list
?@Thalia,对(指针或引用),因为与任何转发声明一样,它没有定义完整的类型。
class QList<int>;
error: specialization of 'QList<int>' after instantiation
template<typename>
class QList;