簡體   English   中英

私有轉換函數導致“模糊的默認類型轉換”錯誤(c ++)

[英]Private conversion function results in “ambiguous default type conversion” error (c++)

首先,一個證明問題的小例子:

struct Bar {
    enum Baz {aa, bb, cc};
    Baz baz_;

    operator Baz() const { return baz_; }
    private:
        template<typename T> operator T() const;
};

int main() {
    Bar bar;
    switch (bar) {
        case Bar::aa:
            break;
        case Bar::bb:
            break;
        case Bar::cc:
            break;
        default:
            break;
    }
    return 0;
}

使用g ++ 4.7.0編譯此代碼會出現以下錯誤:

foo.cpp: In function ‘int main()’:
foo.cpp:12:16: error: ambiguous default type conversion from ‘Bar’
foo.cpp:12:16: error:   candidate conversions include ‘template<class T> Bar::operator T() const’

我的理解是,由於結構對象被“切換”,編譯器將嘗試找到轉換函數為整數或枚舉類型。 我明確地向Bar :: Baz枚舉類型提供了一個公共轉換函數,並希望它能夠使用它。

令我困惑的部分是編譯器還找到私有轉換函數,然后無法決定使用哪個。 為什么甚至考慮私人功能? 如果我添加一個顯式的強制轉換,比如說switch((int)bar) ,那么只有私有轉換函數匹配,並且編譯器正確地抱怨它不能使用它,因為它是私有的。 那么,由於私有轉換函數不能在這種情況下使用,為什么兩者之間沒有明確的選擇呢?

有趣的是,我相信(雖然我不是100%肯定)這個代碼在g ++ 4.6上編譯時沒有錯誤。

編輯:正如James McNellis在評論中指出的那樣,私有轉換函數是模板化的事實在這里也是相關的。

超載解決訪問控制。 這在標准§13.3中規定

過載分辨率是一種機制,用於在給定作為調用參數的表達式列表和可根據調用上下文調用的一組候選函數的情況下選擇要調用的最佳函數。 最佳函數的選擇標准是參數的數量,參數與候選函數的參數類型的匹配程度,對象與隱含對象參數的匹配程度(對於非靜態成員函數)以及對象的某些其他屬性。候選功能。 [注意:過載分辨率選擇的功能不能保證適合上下文。 其他限制(例如函數的可訪問性)可能使其在調用上下文中的使用不正確。 ]

因此,重載決策可以選擇不適合給定上下文的函數。

switch(expression)

表達式必須是整數類型或類類型,對於該類型,有明確的轉換為整數類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM