【问题标题】:non-class template has already been declared as a class template”非类模板已被声明为类模板”
【发布时间】:2021-02-17 11:22:40
【问题描述】:

我读到了替换

#include <SomeClass>

通过

class SomeClass;

可能会带来一些好处,包括加快编译时间。

所以我要检查一个 Qt 项目,并将我的项目头文件中的所有 #include &lt;Qt...&gt; 替换为 class Qt...;。但是当我为QMap 这样做时,它返回了

non-class template has already been declared as a class template”

这是什么意思?

【问题讨论】:

  • 模板类的前向声明需要它的模板参数,template &lt;typename Key, typename Value&gt; class QMap;QMap
  • fwiw,您不能简单地将任何包含替换为前向声明。在前向声明不足的地方,您会遇到其他错误。见这里stackoverflow.com/questions/4757565/…
  • 小心转发第三个库类。别名,(新的)默认模板参数可能会出现,并且对于维护有问题,甚至取决于配置/平台。
  • 到目前为止,我只遇到了QMapQVector 的问题,对于所有其他#include &lt;Qt...&gt;,看起来我可以替换它并且它似乎可以工作

标签: c++ qt qt5 c++17 qmake


【解决方案1】:

类模板的前向声明也应该被模板化:

template <typename Key, typename T> 
class QMap;

请注意,除非您包含正确的标题,否则这些类型是不完整的,并且可以以非常有限的方式使用。如果 Qt 要添加具有默认值的模板参数,假设它不会破坏代码,它会破坏你的前向声明。这可能很简单,比如添加一个默认为std::allocator 的分配器类型。

如果您唯一关心的是编译速度,那么预编译头文件可以为您提供更好的服务。

【讨论】:

  • 我认为我应该同时做 PCH 和前向声明。为什么不呢?
  • @KcFnMi 如果您使用预编译的头文件,前向声明不会影响编译时间,因为头文件已经编译。然而,它们将有助于最大限度地减少依赖关系。
猜你喜欢
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 2019-03-23
相关资源
最近更新 更多