所謂二義性呢,就是出現了多個能夠匹配的方式,導致編譯器無法判斷選擇哪乙個,出現的錯誤。
#include "pch.h"
#include class first
private:
int number;
};class second
private:
int number;
};void xiaoming(const first& a)
void xiaoming(const second& a)
int main()
在上面的簡短程式中,就出現了二義性問題。
全域性函式xiaoming的過載可以接受兩個類型別的物件。
同時,這兩個物件的建構函式,都有接受int型別。
因此當出現,xiaming(2);這種情況時,編譯器不知道是將2轉換到first型別的物件還是second類的物件,導致發生了錯誤。
我自己總結的解決方法:
/*這種情況下,就會發生二義性,導致xiaoming的兩個過載的函式都能夠匹配2這個引數,所以呢,會報錯誤*/
/*解決辦法:說實話,這種情況確實有機率會碰到並且難以查詢,怎麼辦,記得當時看到explicit是說到,我們通常不希望普通型別轉換成類型別,所以呢,
我們給建構函式加上explicit,讓他不能夠進行轉換,所以呢上面這種情況也就可以避免了。這是我認為最好的辦法。
當然如果需要這種型別轉換的話,可以將過載函式中想轉換的那個寫為非explicit,其他的全部都是explicit,讓編譯器只能匹配到乙個函式即可
不夠我強烈不建議,當編寫大程式的時候,容易忽略問題,導致出現難以排查的問題。
例如,上面的程式中,我們可以給其中乙個類的建構函式新增explict
explicit first (int a)
這樣也是可以的*/
C 二義性問題
二義性問題 1.在繼承時,基類之間 或基類與派生類之間發生成員同名時,將出現對成員訪問的不確定性 同名二義性。2.當派生類從多個基類派生,而這些基類又從同乙個基類派生,則在訪問此共同基類中的成員時,將產生另一種不確定性 路徑二義性。同名二義性 同名隱藏規則 解決同名二義的方法 當派生類與基類有同名成...
C 函式過載二義性
說起函式過載,我不由得想起了c 的 多型 特性。多型又分為靜態 編譯時 多型和動態 執行時 多型,靜態多型即為函式過載,動態多型則是虛函式機制。虛函式水較深,先不討論,今天我們來看一下函式過載 作用以及要避免的一些坑 尤其是二義性錯誤 一 先來review一下 函式過載的概念 1.函式名相同 2.形...
C 函式過載二義性
說起函式過載,我不由得想起了c 的 多型 特性。多型又分為靜態 編譯時 多型和動態 執行時 多型,靜態多型即為函式過載,動態多型則是虛函式機制。虛函式水較深,先不討論,今天我們來看一下函式過載 作用以及要避免的一些坑 尤其是二義性錯誤 一 先來review一下 函式過載的概念 1.函式名相同 2.形...