一段代碼引起的思考-----編譯器

今天碰到一個問題,同學寫了一段操作符重載的代碼,但是總是編譯不過,總是提醒'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;

}

這是比較平常的重載‘<<’的例子,我猜想是全局命名空間造成編譯不過的,於是我們把最開始的using namespace std這句話去掉,以std::cout和std::endl代替之,再次編譯,通過。

我把未修改過的代碼用gcc 4.4.3編譯一下,也通過了,相同的代碼在不同的編譯器上也可能會有不同的結果。

在這裏我想到了程序的可控性問題,怎樣讓變量和數據的傳遞在控制之中,讓程序的通用性比較好,避免出現在這個編譯器上編譯通過,而在另外一個編譯器上編譯錯誤,通過這個列子,儘量不要使用全局的命名空間,而使用std::cout和std:endl等代替。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章