【问题标题】:C++ compiles on Windows but errors under OS X GCCC++ 在 Windows 上编译,但在 OS X GCC 下出错
【发布时间】:2013-04-28 13:07:43
【问题描述】:

以下代码在 Visual Studio 2012 Express、Windows 8 下编译得很好

但在我首选的平台上,Eclipse Juno,OS X 上的 GCC 4.2 我收到以下错误:

../src/Test.cpp:20: error: 'std::istream& TestNS::operator>>(std::istream&, TestNS::Test&)' 应该在'TestNS'中声明

#include <cstdio>
#include <cstdlib>
#include <iostream>

using std::istream;

namespace TestNS
{
class Test
{
    friend istream &operator>>(istream &in, Test &value);

public:
    Test(double real, double image);

private:
    double real;
    double image;
    void initialize(double real, double image);

};
}

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include "Header.h"

using std::istream;
using namespace TestNS;

TestNS::Test::Test(double real = 0.0, double image = 0.0) : real(real), image(image)
{

}

void TestNS::Test::initialize(double real,  double image)
{
this->real = real;
this->image = image;
}

istream& TestNS::operator>> (istream &in, TestNS::Test &value)
{
value.real = 10.0;
value.image = 10.0;

return in;

}

int main()
{

}

任何帮助都会非常有帮助。 为学校项目工作。

【问题讨论】:

  • TestNS 不是类,是头文件中的命名空间,教授表示需要。
  • 赋值表示必须是好友函数。
  • 没有TestNS::函数是全局函数不是友元函数,代码在Windows、Visual Studio下编译,但不是Eclipse GCC OS X
  • 它在 OS X 下使用 GCC 4.2 编译
  • 我重新构建了一个全新的项目,仍然不行,路径和符号,包含路径设置为:/usr/include/c++/4.2.1。

标签: c++ eclipse macos gcc


【解决方案1】:

看来 GCC 给出的错误是正确的。在您的示例中,operator&gt;&gt; 的朋友声明确实指定 operator&gt;&gt; 将成为 TestNS 的成员,但实际上并没有在那里声明它。您仍然需要在 TestNS 内部声明 operator&gt;&gt;,然后才能在 TestNS 外部定义它:

namespace TestNS
{
    class Test
    {
        friend istream &operator>>(istream &in, Test &value);

    public:
        Test(double real, double image);

    private:
        double real;
        double image;
        void initialize(double real, double image);

    };

    istream &operator>>(istream &in,Test &value); // need this
}

现在可以了:

istream& TestNS::operator>> (istream &in, TestNS::Test &value)
{
    value.real = 10.0;
    value.image = 10.0;        
    return in;    
}

标准的相关部分是7.3.1.2 p2 (for C++03):

命名命名空间的成员也可以在该命名空间之外定义 命名空间,通过明确限定正在定义的名称, 前提是要定义的实体已经在命名空间中声明...

下一段表明(虽然有点间接)虽然类中的友元声明确实使函数成为命名空间的成员,但它实际上并没有在那里声明它,因为函数的名称需要单独声明在命名空间中可见:

如果非本地类中的friend 声明首先声明了一个类 或函数,朋友类或函数是最内层的成员 封闭的命名空间。找不到朋友函数的名称 简单的名称查找直到提供匹配的声明 命名空间范围(在类声明授予之前或之后 友谊)。

【讨论】:

  • 感谢 Vaughn,提供了很棒的参考资料。
猜你喜欢
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 2012-10-25
  • 2015-05-17
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多