【问题标题】:Forward declaration of (sdk) class containing template包含模板的 (sdk) 类的前向声明
【发布时间】:2015-08-17 15:27:26
【问题描述】:

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

class MyClass {
public:
  MyClass();
  void aFunction();
private:
  QList<int> m_member;
};

要构建它,我需要提供有关 QList 的此类信息。我试过了:

class QList;

error: template argument required for 'class QList'

我试过了(因为我只需要 QList 这个特定类中的整数):

class QList<int>;

error: specialization of 'QList<int>' after instantiation

我已经查看了这些错误,但只发现了人们在创建类模板时遇到的问题,没有发现任何关于前向声明的问题。

如果没有其他方法,我可以在头文件中 #include &lt;QList&gt; 并放弃前向声明 - 但我想了解这个问题。

关于template classes forward declarations的最热门问题也建议使用此选项:

只需#include &lt;list&gt;,别担心。

我不明白other answers...

【问题讨论】:

  • 如果你想让QList&lt;int&gt; 作为你的类的成员,无论如何都需要完整的声明(因为编译器需要计算你的类的大小)。使用前向声明,您可以拥有指针或引用,但仅此而已。
  • @BoPersson 如果列表的大小未知,它怎么能做到这一点?
  • QList&lt;int&gt; 对象将始终具有相同的大小。列表中的ints会单独分配。
  • 你引用的编译器错误听起来像&lt;QList&gt;,实际上已经包含在内,所以再次包含它不会有什么坏处。

标签: c++ templates forward-declaration


【解决方案1】:

你可以转发声明一个模板类,像这样:

template<typename>
class QList;

但如果你声明一个不是引用或指针的类型的成员(即 m_member),它将不起作用。

【讨论】:

  • 哦,所以如果我想要这个,我的私人成员需要成为引用......帽子会起作用......我必须将它们声明为QList&lt;typename&gt;*m_list 吗?
  • @Thalia,对(指针或引用),因为就像任何前向声明一样,它没有定义完整的类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2014-04-22
  • 2016-12-29
相关资源
最近更新 更多