Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Windows上编译C++,但在OS X GCC下编译错误_C++_Eclipse_Macos_Gcc - Fatal编程技术网

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

在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

下面的代码在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 <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。感谢沃恩,提供了非常棒的参考。感谢沃恩,提供了非常棒的参考。