[英]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
operator int
和A(int)
構造函數,它為它提供了第二條路徑B => int => A
...它不知道該選哪個。
要修復編譯,我可以:
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.