c ++模板:无法识别的模板声明/定义

时间:2018-09-05 07:23:17

标签: c++ templates visual-c++

我是C ++的新手,最近遇到了与模板有关的编译错误。 以下是我为重现此问题而创建的最少代码。 我在Visual Studio中构建它。

#include <iostream>
#include <string>
using namespace std;
struct IObject
{
    virtual ~IObject() = default;
    virtual void dosomething() = 0;
};

template <class T> struct ObjectImpl<T> :IObject
{
    void dosomething() override {}
};
int main()
{
    getchar();
    return 0;
}

错误消息是:无法识别的模板声明/定义。 我以前见过人们创建这种模板。 有谁知道为什么我会收到此错误。

2 个答案:

答案 0 :(得分:4)

您的问题出在这一行:

template <class T> struct ObjectImpl<T> :IObject

声明此模板的有效语法为:

template <class T> struct ObjectImpl :IObject

<T>不应位于类模板名称的右侧,因为已经在template <class T>部分中指定了一次。 / p>

答案 1 :(得分:0)

正如@songyuanyao在评论中所提到的,您只需要从模板实现中删除,就像这样:

#include <iostream>
#include <string>
using namespace std;

struct IObject
{
    virtual ~IObject() = default;
    virtual void dosomething() = 0;
};

template <class T> 
struct ObjectImpl :IObject
{
    /* Use T here, if desired */
    void dosomething() override {}
};

int main()
{
    return 0;
}

这是因为您正在尝试将接收到的模板提供给您正在使用的模板。这会导致语法无效,因为系统不希望模板通过。

不过,在结构的花括号内,您可以使用给定的模板,也可以使用它生成新的类。

(此外,如您所见,我删除了getchar();因为它不执行任何操作,只生成了超时,因为没有任何输入)