C++ 包含模板的(sdk)类的转发声明

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”在实例化后专门化 我查找了这些错误,但只发现了创建类模板有困难的人的问题,没有发现任何关于转发声明的

我一直在头文件中进行转发声明,并在cpp中包含实际的类文件。但是当类被模板化时,我遇到了问题:

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;