C ++在Windows上编译但在OS X GCC下出现错误

时间:2013-05-04 04:31:45

标签: c++ eclipse macos gcc

以下代码在Visual Studio 2012 Express,Windows 8

下编译得很好

但是在我喜欢的平台上,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()
{

}

任何帮助都会对您有所帮助。 为学校项目工作。

1 个答案:

答案 0 :(得分:4)

看来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声明确实使该函数成为命名空间的成员,但它实际上并没有在那里声明它,因为函数的名称必须单独声明在命名空间中可见:

  

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