今天碰到一個問題,同學寫了一段操作符重載的代碼,但是總是編譯不過,總是提醒'operator <<' is ambiguous,這是指'<<'被多次定義了,他用的是vc++ 6.0,代碼如下:
#include <iostream>
using namespace std;
class Point
{
public:
Point(float x=0,float y=0);
void setPoint(float,float);
float getXpoint() const {return x;}
float getypoint() const {return y;}
friend ostream & operator<< (ostream & os,Point & p);
private:
float x;
float y;
};
Point::Point(float a,float b)
{
x=a;
y=b;
}
void Point::setPoint(float a,float b)
{
x=a;
y=b;
}
ostream & operator<< (ostream & output,Point & p)
{
output << "[" <<p.getXpoint()<<","<<p.getypoint() << "]" << endl;
return output;
}
int main()
{
Point p(4.5,5.5);
cout << "x=" << p.getXpoint() << ",y=" << p.getypoint() << endl;
p.setPoint(8.5,9.5);
cout << p;
return 0;
www.2cto.com
}
這是比較平常的重載‘<<’的例子,我猜想是全局命名空間造成編譯不過的,於是我們把最開始的using namespace std這句話去掉,以std::cout和std::endl代替之,再次編譯,通過。
我把未修改過的代碼用gcc 4.4.3編譯一下,也通過了,相同的代碼在不同的編譯器上也可能會有不同的結果。
在這裡我想到了程序的可控性問題,怎樣讓變量和數據的傳遞在控制之中,讓程序的通用性比較好,避免出現在這個編譯器上編譯通過,而在另外一個編譯器上編譯錯誤,通過這個列子,盡量不要使用全局的命名空間,而使用std::cout和std:endl等代替。
摘自 maochencw的專欄