以下代码在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()
{
}
任何帮助都会对您有所帮助。 为学校项目工作。
答案 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
声明首先声明一个类 或函数,朋友类或函数是最里面的成员 封闭命名空间。找不到好友功能的名称 简单名称查找,直到在其中提供匹配的声明 命名空间范围(在类声明授予之前或之后 友谊)。