&引用;“尼斯”;c++;? 所以我正在做一些简单的C++练习,我注意到一个有趣的壮举。归根结底,我们可以尝试编译以下代码: class nice { public: nice() {} }; int main() { nice n; return 0; };

&引用;“尼斯”;c++;? 所以我正在做一些简单的C++练习,我注意到一个有趣的壮举。归根结底,我们可以尝试编译以下代码: class nice { public: nice() {} }; int main() { nice n; return 0; };,c++,C++,结果是出现如下编译错误: <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 而

结果是出现如下编译错误:

<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
而不是

nice n;
解决了这个问题

我是一个相对的C++新手,来自ActionScript/.NET/java/python世界。 更新:

对,我不好,我也有

#include <iostream>
#包括

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

对我来说很好。您是否尝试了您发布的确切代码?

可能问题是由于libc中的函数
nice
造成的。这类似于使用名称空间std尝试命名类
printf

,是否有可能

编辑:

该标准规定,标准标题定义了名称空间std中的所有符号(见17.4.1.2.4)。 然而,脚注中还指出,变体将其名称转储到全局名称空间中,但当然不应该使用这些名称;)

试试这个版本:

#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;
}
另外,单独参考
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

我认为这很好地解释了发生的事情-nice现在存在于两个名称空间中,编译器无法确定您指的是哪一个。

这是一个名称空间问题,但与名称空间std无关。标题
正在拉入

如果你尝试

class nice
{
  public:
      nice() {};
};

int main(int argc, char *argv[])
{
    nice n;

    return 0;
}
没问题

简单地加上

#include <unistd.h>
#包括
您将得到“预期的”;“在'n'之前”错误。名称空间std未进入图片

因此,解决方案与以前相同-将类nice放在其自己的命名空间中,并且不会与global::nice()冲突。

extern“C”
{
#包括
}

对,不,我在顶部有一个#include:)可能就是这样。问题的根源不是
#include
,而是
使用命名空间std
@自动计算-我不认为它是名称空间std,它与全局名称空间冲突。正在引入,它与::nice()冲突。正如许多人所说,它听起来像是“std”名称空间。一旦你确认了这一点,请将其中一个答案标记为“已接受”(绿色复选标记),而不是一个不是真正的答案。这就是为什么介绍性文本不应该以“使用名称空间std”开始,只是为了节省一些重复的“std::”s。冲突的不是名称空间std,这是全局名称空间。如果有人好奇(就像我一样),这里有一些关于函数std::nice()的信息(向下滚动到底部)是的,niceness是Linux内核用于调度目的的值。我刚刚想到这就是它的目的…nice()不在std中,它是全局的;在C.继承的,在ISOC++中没有.h变体。不过,一个实现可能会提供一个,因为headername不是由ISO C++@MSalters保留的是,确切地说:不是C头,因此它不会将任何符号放入全局名称空间。
class nice
{
  public:
      nice() {};
};

int main(int argc, char *argv[])
{
    nice n;

    return 0;
}
#include <unistd.h>
extern "C"
{
#include <unistd.h>
}