在Windows上编译C++,但在OS X GCC下编译错误
下面的代码在VisualStudio2012 Express、Windows8下编译得很好 但是在我喜欢的平台EclipseJuno上,OSX上的GCC4.2 我收到以下错误: ../src/Test.cpp:20:错误:“std::istream&TestNS::operator>>std::istream&,TestNS::Test&”应在“TestNS”中声明在Windows上编译C++,但在OS X GCC下编译错误,c++,eclipse,macos,gcc,C++,Eclipse,Macos,Gcc,下面的代码在VisualStudio2012 Express、Windows8下编译得很好 但是在我喜欢的平台EclipseJuno上,OSX上的GCC4.2 我收到以下错误: ../src/Test.cpp:20:错误:“std::istream&TestNS::operator>>std::istream&,TestNS::Test&”应在“TestNS”中声明 #include <cstdio> #include <cstdlib> #include <ios
#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给出的错误似乎是正确的。在您的示例中,操作符>>的友元声明确实指定操作符>>将是TestNS的成员,但它实际上并没有在那里声明它。您仍然需要在TestNS内部声明operator>>,然后才能在TestNS外部定义它: 现在这是好的:
istream& TestNS::operator>> (istream &in, TestNS::Test &value)
{
value.real = 10.0;
value.image = 10.0;
return in;
}
对于C++03,本标准的相关部分为7.3.1.2 p2:
命名命名空间的成员也可以在该命名空间之外定义
通过定义的名称的显式限定的命名空间,
如果要定义的实体已在命名空间中声明
下一段虽然有点间接地指出,尽管类中的友元声明确实使函数成为命名空间的成员,但它实际上并没有在那里声明它,因为函数名在命名空间中可见需要单独声明:
如果非本地类中的友元声明首先声明一个类
或者函数,friend类或者函数是最里面的一个成员
封闭命名空间。找不到友元函数的名称
简单的名称查找,直到在其中提供匹配声明为止
类声明之前或之后的命名空间范围
友谊
看来GCC给出的错误是正确的。在您的示例中,操作符>>的友元声明确实指定操作符>>将是TestNS的成员,但它实际上并没有在那里声明它。您仍然需要在TestNS内部声明operator>>,然后才能在TestNS外部定义它: 现在这是好的:
istream& TestNS::operator>> (istream &in, TestNS::Test &value)
{
value.real = 10.0;
value.image = 10.0;
return in;
}
对于C++03,本标准的相关部分为7.3.1.2 p2:
命名命名空间的成员也可以在该命名空间之外定义
通过定义的名称的显式限定的命名空间,
如果要定义的实体已在命名空间中声明
下一段虽然有点间接地指出,尽管类中的友元声明确实使函数成为命名空间的成员,但它实际上并没有在那里声明它,因为函数名在命名空间中可见需要单独声明:
如果非本地类中的友元声明首先声明一个类
或者函数,friend类或者函数是最里面的一个成员
封闭命名空间。找不到友元函数的名称
简单的名称查找,直到在其中提供匹配声明为止
类声明之前或之后的命名空间范围
友谊
TestNS不是类,它是头文件中的命名空间,professor表示需要。assignment表示必须是friend函数。如果没有TestNS::函数是全局函数而不是friend函数,则代码在Windows、Visual Studio、,但不是Eclipse GCC OS Xit使用GCC 4.2在OS X下编译我重建了一个全新的项目,但仍然不起作用,路径和符号,包含路径设置为:/usr/include/c++/4.2.1.TestNS不是类,而是头文件中的名称空间,professor指出这是必需的。assignment指出必须是friend函数。没有TestNS::函数是全局函数而不是friend函数,代码在Windows、Visual Studio下编译,但不是Eclipse GCC OS Xit使用GCC 4.2在OS X下编译我重建了一个全新的项目,但仍然无法运行,路径和符号,包含路径设置为:/usr/include/c++/4.2.1。感谢沃恩,提供了非常棒的参考。感谢沃恩,提供了非常棒的参考。