以下代码在Windows 8的Visual Studio 2012 Express下可以正常编译

但是在我偏爱的平台Eclipse Juno和OS X上的GCC 4.2上
我收到以下错误:

../src/Test.cpp:20:错误:'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()
{

}

任何帮助将是最有帮助的。
从事学校项目的作业。

最佳答案

看来GCC提供错误是正确的。在您的示例中,operator>>的好友声明确实指定operator>>将成为TestNS的成员,但实际上并未在其中声明它。您仍然需要在operator>>中声明TestNS,然后才能在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(对于C++ 03):



下一段表明(尽管在某种程度上是间接的),尽管类中的friend声明确实使函数成为 namespace 的成员,但实际上并没有在那里声明它,因为要使函数名称在函数库中可见,需要单独的声明。命名空间:

10-08 03:50