2015-03-25 27 views
1

下面的代碼:gcc編譯錯誤,對象初始化解釋爲函數指針?

class Angle { 
protected: 
    double rad; 
    Angle(double r) : rad(r){} 
}; 

class Radian : public Angle { 
public: 
    Radian(double rad) : Angle(rad){} 
}; 

class Latitude : public Angle { 
public: 
    Latitude(const Angle&a) : Angle(a){} 
    Latitude operator-(const Latitude &other){ 
     return Latitude(Radian(rad-other.rad)); 
    } 
}; 

int main(){ 
    double d = 0.7; 
    Latitude lat1(Radian(0.8)); 
    Latitude lat2(Radian(d*1)); 
    Latitude lat3(Radian(d)); 
    Latitude diff2 = lat1 - lat2; 
    Latitude diff3 = lat1 - lat3; 
    return 0; 
} 

會產生編譯錯誤:

$ g++ bug.cpp 
bug.cpp: In function ‘int main()’: 
bug.cpp:26:26: error: no match for ‘operator-’ (operand types are ‘Latitude’ and ‘Latitude(Radian)’) 
    Latitude diff3 = lat1 - lat3; 
         ^
bug.cpp:26:26: note: candidate is: 
bug.cpp:15:13: note: Latitude Latitude::operator-(const Latitude&) 
    Latitude operator-(const Latitude&l){ 
      ^
bug.cpp:15:13: note: no known conversion for argument 1 from ‘Latitude(Radian)’ to ‘const Latitude&’ 

如果我嘗試做lat3 - lat3它將給這個錯誤,這表明它解釋lat3作爲函數指針:

error: ISO C++ forbids using pointer to a function in subtraction [-fpermissive] 
lat3 - lat3; 
    ^

lat2 - lat2沒問題。

那麼這裏發生了什麼?爲什麼lat2和lat3解釋爲不同的類型?錯誤消息中的Latitude(Radian)究竟意味着什麼?

編譯器輸出來自gcc 4.9.1,使用gcc版本4.1到4.9可以獲得類似的結果。平臺是64位RHEL6。

回答

1

改變你的線路:

Latitude lat3((Radian(d))); 

你碰到被稱爲

http://en.wikipedia.org/wiki/Most_vexing_parse

+1

或者使用緯度lat3問題{弧度(d)}; – senfen 2015-03-25 11:08:34

+0

或者將行改爲Latitude lat3(Radian((double)d)); – 2015-03-25 11:24:14