二義性問題之過載函式和轉換建構函式

2021-10-01 04:59:47 字數 934 閱讀 1937

所謂二義性呢,就是出現了多個能夠匹配的方式,導致編譯器無法判斷選擇哪乙個,出現的錯誤。

#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.形...