0

最近,我在 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) 上的结果 GCC 4.1.2输出:

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

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

4

3 回答 3

7

如果我尝试

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++ -Wfatal-errors 我得到

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

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

于 2012-09-20T13:53:08.700 回答
3

看起来 Codepad 默默地添加了一堆#includes 和 ausing namespace std;无论你是否想要它们:请参阅这个不应自行编译的示例:

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

Output: Hello

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

于 2012-09-20T13:57:46.413 回答
0

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

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

(尽管这不适用于此处的特定情况,但此答案可能会帮助其他在寻求帮助时浏览此页面的人。)

于 2015-06-23T11:30:03.320 回答