GCC 错误:'X'不是模板?

GCC bug: 'X' is not a template?

本文关键字:错误 GCC      更新时间:2023-10-16

最近,我在Codepad上测试了一些模板代码。虽然代码是正确的,但 GCC 给了我一个非常奇怪的错误。我也在 Ideone 上测试了它:

测试代码:

template<int num>
struct count;
template<>
struct count<-1>
{
};
int main()
{
 return 0;
}

以下是Codepad (GCC 4.1.2)和Ideone(GCC 4.3.4)上的结果:

Line 5: error: 'count' is not a template

而 GCC 4.3.4 正常编译没有错误。这真的是一个编译器错误,还是我的代码不正确(并且由于扩展而编译?

如果我尝试

template<int num>
struct count;
template<>
struct count<-1>
{
};
int main()
{
 return 0;
}

使用 g++ 4.1.2,我没有问题。 如果我尝试

#include <algorithm>
using namespace std;
template<int num>
struct count;
template<>
struct count<-1>
{
};
int main()
{
 return 0;
}

使用 g++ -我得到的致命错误

count.cpp:8: error: 'count' is not a template
compilation terminated due to -Wfatal-errors.

所以我的猜测是 Codepad 正在强制你触发错误的序言。

看起来Codepad默默地添加了一堆#include s和一个using namespace std;,无论您是否愿意它们:请参阅此示例,该示例不应自行编译:

int main()
{
    cout << "Hello" << endl;
}
Output: Hello

这可能会破坏像您这样的代码,该代码在全局命名空间中定义了一个名称(count),该名称也存在于std命名空间中。

此错误最可能的原因是标识符名称之间的冲突。

有时,一个人从一堂课开始。该类将在一段时间后扩展到模板中。当此时仍有类原型时(例如,在不同的头文件中),编译器将发出此错误。

(虽然这不适用于这里的具体情况,但这个答案可能会帮助在寻求帮助时遇到此页面的其他人。