我是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;
}
错误消息是:无法识别的模板声明/定义。 我以前见过人们创建这种模板。 有谁知道为什么我会收到此错误。
答案 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();因为它不执行任何操作,只生成了超时,因为没有任何输入)