2017-08-12 49 views
3

我的問題是爲什麼自動類型轉換在C++中調用重載函數時不起作用。示例代碼如下:C++函數過載不明確,沒有自動類型轉換

void test(char t); 
void test(short t); 
void test(long long t); 

void main(){ 
    int a=8; 
    test(a); 
} 

如果我編譯上面的代碼使用g ++ /鐺++,函數重載模棱兩可的誤差將出現在

試驗(a)

爲什麼不編譯器在此應用自動類型轉換規則?可變在功能主()INT類型應交談成型一個長長避免精度損失。 我不想編寫類型爲int或long的重複函數。當然,我可以避開下面顯式轉換錯誤:

測試((加長)一)

但是,我必須每次我需要調用測試時間(使用顯式強制long long) int或long類型的參數?有什麼方法讓編譯器更加智能?

謝謝你的答案。

回答

1

總之 - 是的,你必須明確地施放每次。

在你的情況下,問題是你有多個可能的類型轉換。 int可以隱式轉換爲您所有的三種類型(charshort,long long)。 因此編譯器無法確定在這種情況下要使用的類型轉換。

你可以閱讀更多關於隱式類型轉換這裏http://en.cppreference.com/w/cpp/language/implicit_conversion

你可以用模板實現你的目標:

// any type that hasn't explicit definition 
template <typename T = long long> 
void test(T t); 

// process char differently 
void test(char c); 

// process short differently 
void test(short c); 

這是肯定不安全,但可能。我建議你在模板函數中添加靜態斷言。

+0

謝謝您的回答。我閱讀鏈接,它說數字轉換的自動類型轉換是從較窄的到更寬的,以避免精度的損失,對吧?在我的例子中,char和short比int小,所以int不應該隱式地轉換爲int,但是int可以長時間隱式轉換,因爲long long比int寬。當隱式地將int轉換爲char或short時,會導致精度損失。劑量編譯器是否認爲int可以隱式轉換爲我所有的三種類型(char,short,long long)? – user3475622

+0

不知道,但據我所知,所有編譯器都以這種方式運行。在我看來 - 顯式比隱式更好。 –

+0

如果你真的需要實現你的目標,請看我編輯的答案。 –

2

任何自動類型轉換都是隱式轉換,如果沒有完成明確在源代碼中。整型均比int窄(charsigned char,無符號的字符,short intunsigned short)的 價值提升爲int

所以當你做到這一點感到困惑調用哪一個(既含蓄變得無效測試(int t)

void test(char t); 
void test(short t); 

int main(){ 
    int a=8; 
    test(a); 

} 

但是,當你發送的確切數據類型信息不會混淆

#include<iostream> 


void test(int t); 
void test(short t); 
void test(long long t); 

int main(){ 
    int a=8; 
    test(a); 
} 

如果您將離開編譯器肯定決定你將成爲問題

按照鏈接停止隱式轉換

Stop Implicit conversion

+0

我知道自動類型轉換是一種隱式轉換,但爲什麼編譯器會感到困惑? char和short比int窄,int比long long窄,所以如果測試(a)調用test(char)或者測試(short),那麼a會失去一些精度,而調用test(long long)是完美的。數字轉換自動類型轉換的規則之一是避免精度損失,對嗎? – user3475622

+0

我的老師曾經講過一個故事:)它喜歡當你想給兒子寫信時,如果兒子不在,父親可以拿這封信。在你的情況下,因爲當你做int a = 8; test(a);沒有接收器是可用的,所以試圖讓多個人的行爲像父親..試一下void test(int t); 無效測試(短t); int main(){ int a = 8; test(a); }你會看到沒有問題 –

+0

它就像當你混淆編譯器..compiler會迷惑你。如果有函數接受int然後發送int。不要讓編譯器假設 –