c ++中的“nice”关键字?

时间:2010-02-13 23:58:23

标签: c++

所以我做了一些简单的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>

在顶部,这似乎是问题的根源,因为没有它,一切正常。

6 个答案:

答案 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。我无法重复使用的唯一内容是intnamespace等保留字。

注意:如果你说:

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>
}