【问题标题】:template specialization -->error: explicit specialization of non-template struct 'GameObjectImpl'模板专业化 - >错误:非模板结构'GameObjectimpl'显式专业化'
【发布时间】:2018-09-28 01:01:02
【问题描述】:

我正在编写一个游戏,我有一个名为 GameObject 的界面。
这个游戏对象是由派生对象实现的,比如行星、彗星、小行星等。现在我需要这些对象在不同功能中的 type_index。

为了实现这一点,我在 GameObject 中定义了虚函数,并希望使用具有派生类类型的模板模式。不幸的是我收到错误 错误:非模板结构“GameObjectImpl”的显式特化 模板结构 GameObjectImpl : 游戏对象 ^

以下是源码

struct GameObject
{
    virtual ~GameObject() = default;
    virtual type_index type() const = 0;
};
template <typename T> struct GameObjectImpl<T> : GameObject //error
{
    type_index type() const override
    {
        return typeid(T);
    }
};

struct Planet : GameObjectImpl<Planet>{};
struct Asteriod : GameObjectImpl<Asteriod>{};

你能告诉我如何摆脱这个错误。请注意我正在学习模板模式所以只想使用模板

【问题讨论】:

  • template &lt;typename T&gt; struct GameObjectImpl : GameObject { ... }; 删除&lt;T&gt;
  • @IgorTandetnik 这看起来更像是一个答案而不是评论。

标签: qt c++11 templates


【解决方案1】:

要专门化一个模板,必须有一个专门化的模板:

template <typename T>
struct GameObjectImpl {

};

考虑到如果你特化一个类模板,你还必须特化所有的成员函数

【讨论】:

    【解决方案2】:

    这是一个模板

    template <typename T> 
      struct GameObjectImpl : 
        GameObject 
    

    这是一个模板专业化

    template <typename T> 
      struct GameObjectImpl<T> : 
        GameObject
    

    而且可能不是一个有效的专业化(它似乎没有专门化任何东西)。语法 GameObjectImpl&lt;T&gt; 要求已在某处定义了名为 GameObjectImpl 的模板。

    您很可能想要定义一个模板,而不是模板专业化。

    【讨论】:

      猜你喜欢
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多