所以我做了一些简单的C ++练习,我发现了一个有趣的壮举。归结为裸机可以尝试编译以下代码:
class nice
{
public:
nice() {}
};
int main()
{
nice n;
return 0;
};
结果是编译错误,如下所示:
<file>.cpp: In function ‘int main()’:
<file>.cpp:11: error: expected `;' before ‘n’
<file>.cpp:11: warning: statement is a reference, not call, to function ‘nice’
<file>.cpp:11: warning: statement has no effect
这是在Max OS X上使用常规g ++,我的一些朋友也试过Ubuntu,产生相同的结果。
这个专长似乎在于“好”这个词,因为重构它可以让我们编译。现在,我找不到C ++或C关键字列表中的“好”,所以我想知道这里是否有人有想法?
另外,提出
class nice n;
而不是
nice n;
解决了这个问题。
P.S。我是一个相对的C ++新手,来自ActionScript / .NET / Java / Python世界。
更新
是的,我的坏,我也有一个
#include <iostream>
在顶部,这似乎是问题的根源,因为没有它,一切正常。
答案 0 :(得分:17)
也许问题是由libc中的函数nice
引起的。它类似于尝试命名您的班级printf
。
答案 1 :(得分:4)
using namespace std
,任何机会?
编辑:
标准说标准头文件在名称空间std中定义了它们的所有符号(见17.4.1.2.4)。 然而,一个脚注也说&lt; .h&gt; variants将其名称转储到全局命名空间中 - 但当然没有人应该使用它们;)
答案 2 :(得分:3)
试试这个版本:
#include <iostream>
namespace test
{
class nice
{
public:
nice() {}
};
};
using namespace std;
int main()
{
test::nice n;
cout << "well I think this works." << endl;
return 0;
}
在这种情况下,我已经定义了自己的命名空间test
。这样做,我可以使用我喜欢的任何类名,包括已定义的函数,如printf
。我无法重复使用的唯一内容是int
或namespace
等保留字。
注意:如果你说:
using namespace test;
同样单独参考nice
,您将收到此错误:
nice.cpp: In function ‘int main()’:
nice.cpp:18: error: reference to ‘nice’ is ambiguous
/usr/include/unistd.h:593: error: candidates are: int nice(int)
nice.cpp:7: error: class test::nice
我认为很好地解释了发生了什么 - 现在很好地存在于两个命名空间中,编译器无法解决你的意思。
答案 3 :(得分:3)
这是名称空间问题,但不,名称空间为std。标题<iostream>
正在引入<unistd.h>
如果您尝试
class nice
{
public:
nice() {};
};
int main(int argc, char *argv[])
{
nice n;
return 0;
}
没有问题。
只需添加
#include <unistd.h>
你将得到“预期的”;“在'n'之前”的错误。命名空间std不会进入图片。
所以解决方案和以前一样 - 把class放在自己的命名空间中,它不会与global :: nice()冲突。
答案 4 :(得分:2)
对我来说很好。您是否尝试过发布的确切代码?
答案 5 :(得分:0)
extern "C"
{
#include <unistd.h>
}