簡體   English   中英

C++編譯錯誤:無法從B轉換為A,沒有構造函數,或者構造函數重載歧義

[英]C++ compilation error: cannot convert from B to A, no constructor, or constructor overload ambiguity

我有一些暗示類型轉換的代碼,盡管有一種轉換方法,但它無法編譯......

class A
{
public:
    A(void) :_m(0) { }
    A(int val) : _m(val) {}
private:
    int _m;
};
class B
{
public:
    B(void) : _m(0) {}
    B(int val) : _m(val) {}
    B(const A&);
    // there is a direct conversion operator here
    operator A(void) const { return A(_m); }
    operator int(void) const { return _m; }
private:
    int _m;
};
int main()
{
    B b;
    A a = (A)b; // error C2440 here
}

這是錯誤消息:

error C2440: 'type cast': cannot convert from 'B' to 'A'
message : No constructor could take the source type, or constructor overload resolution was ambiguous

據我了解,編譯器嘗試了幾種路徑來解釋a = (A)b

  • 它找到operator A
  • 但它也找到了 B 上的operator intA(int)構造函數,它為它提供了第二條路徑B => int => A ...

它不知道該選哪個。

要修復編譯,我可以:

  • 從 B 中刪除operator int
  • 將錯誤行改寫為A a = b.operator A(); ...

錯誤信息表示這兩個運算符

operator A(void) const { return A(_m); }
operator int(void) const { return _m; }

可以在表達式中使用

(A)b;

因此,使用這些轉換運算符可以使用構造函數A( int )或默認的復制構造函數A( const A & )

為了更清楚地重寫相應的聲明,如

A a = A( b );

因此,是使用第一個轉換運算符將 object b 轉換為 A 類型的 object 還是使用第二個轉換運算符轉換為 int 類型的 object。

您可以避免聲明運算符的歧義,例如

operator A(void) const & { return A(_m); }
operator int(void) const && { return _m; }

也就是說,對於左值,將使用第一個運算符,對於右值,將使用第二個運算符。

這是帶有修改后的運算符的程序。

#include <iostream>
class A
{
public:
    A(void) :_m(0) { }
    A(int val) : _m(val) {}
private:
    int _m;
};
class B
{
public:
    B(void) : _m(0) {}
    B(int val) : _m(val) {}
    B(const A&);
    // there is a direct conversion operator here
    operator A(void) const & { return A(_m); }
    operator int(void) const && { return _m; }
private:
    int _m;
};

int main()
{
    B b;
    A a = b; 
    A a1 = B();
}

暫無
暫無

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

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