2014-11-06 357 views
2

我有一個代碼運營商T(){} - 不工作

class smallDOUBLE; 

class smallINT 
{ 
private: 
    int val; 
public: 
    smallINT():val(0){} 
    smallINT(int i):val(i){} 
    operator smallDOUBLE() {return val;} 
}; 

class smallDOUBLE 
{ 
private: 
    double val; 
public: 
    smallDOUBLE():val(0){} 
    smallDOUBLE(double i):val(i){} 
    operator smallINT() { return val;} 
}; 

int main() 
{ 
    smallINT int1(10); 
    smallDOUBLE DBL1(123.22); 
    smallINT int2 = DBL1; 
    smallDOUBLE DBL2 = int1; 
} 

這裏smallINT int2 = DBL1;的主要工作正常,但smallDOUBLE DBL2 = int1;拋出錯誤說

返回類型smallDOUBLE是不完整的

編譯期間。

爲什麼operator smallINT() { return val;}工作

operator smallDOUBLE() {return val;}不?

enter image description here

+0

上面的代碼,如果放在一個cpp文件中,不會在main中編譯失敗。它確實在其他地方。請張貼實際演示您的問題的代碼,幷包含錯誤**和**錯誤發生的行。 – Yakk 2014-11-06 13:02:31

+0

請注意,第一個錯誤是在您的運營商。 main中的錯誤是不相關的(並且由操作員中的錯誤引起)。第一個之後的錯誤很少有用。 – Yakk 2014-11-06 13:29:35

回答

3

錯誤是告訴:爲了實現轉換功能,你需要的類型的功能轉換要被執行。在類smallDOUBLE的定義之後移動operator smallDOUBLE()的定義將產生可編譯的程序。

class smallDOUBLE; 

class smallINT 
{ 
private: 
int val; 
public: 
    smallINT():val(0){} 
    smallINT(int i):val(i){} 
    operator smallDOUBLE(); 
}; 

class smallDOUBLE 
{ 
private: 
double val; 
public: 
    smallDOUBLE():val(0){} 
    smallDOUBLE(double i):val(i){} 
    // smallINT already defined, no problem here... 
    operator smallINT() { return val;} 
}; 

// now that smallDOUBLE is defined... 
smallINT::operator smallDOUBLE(){return val;} 

int main() 
{ 
    smallINT int1(10); 
    smallDOUBLE DBL1(123.22); 
    smallINT int2 = DBL1; 
    smallDOUBLE DBL2 = int1; 
} 
+0

@ didierc-不是編譯器的責任,如果它是前向聲明的話,找到類的定義? – InQusitive 2014-11-06 13:20:52

+0

@InQusitive No. – leemes 2014-11-06 13:28:30

+0

我認爲這個問題足夠複雜,應該被「正式」詢問,而不僅僅是一個評論。如果從字面上看,@ eymes是正確的。否則,有兩種可能的解釋:(1)編譯器是否足夠聰明,可以在完全解析翻譯單元之後檢測類是否定義良好。 (2)編譯器不能假定稍後會提供一個聲明的類(可能由另一個翻譯單元提供),並讓轉換函數調用尚未定義的符號。 – didierc 2014-11-06 13:46:59

3

你得到的錯誤,因爲轉換運算符返回類型不能用一個不完整的類型。要解決這一點,你可以聲明,但不能確定,直到其他類被定義

class smallDOUBLE; 

class smallINT 
{ 
private: 
    int val; 
public: 
    smallINT() :val(0){} 
    smallINT(int i) :val(i){} 
    operator smallDOUBLE(); 
}; 

class smallDOUBLE 
{ 
private: 
    double val; 
public: 
    smallDOUBLE() :val(0){} 
    smallDOUBLE(double i) :val(i){} 
    operator smallINT() { return val; } 
}; 

smallINT::operator smallDOUBLE() { return val; } 

Live Example