![](/img/trans.png)
[英]msvc /permissive- std::string overloaded operator '=' is ambiguous
[英]'operator =' is ambiguous for std::string
我正在嘗試用自己的轉換運算符編寫一個類,但是我遇到了多個operator=
s的問題
我設法用下面的小代碼重現了這個問題
#include <string>
class X
{
public:
operator const char*() const {
return "a";
}
operator std::string() {
return "c";
}
};
void func( )
{
X x;
std::string s = "";
s = x;
}
我知道std::basic_string
有多個賦值運算符,這就是編譯器混淆的原因。
如果我刪除任何一個強制轉換運算符,它可以工作,但我想知道是否有一種方法可以保留兩個運算符。
我的班級將根據演員表返回不同的值。
我也可以使用static_cast<std::string>(x)
來強制執行轉換,但我想知道是否有一種方法可以在沒有靜態轉換的情況下執行此操作?
正如KerrekSB 建議的那樣 ,你可以使用
s = std::string(x);
或者,您可以執行演員表:
s = (std::string) x;
// or
s = static_cast<std::string>(x);
第三種選擇(由於可讀性問題,我希望不經常在野外看到)是直接訪問操作員:
s = x.operator std::string();
如果你願意做一個稍微不同的API的權衡(和修復任何潛在的破損),你可以做什么羅伯托建議 ,並迫使剛的顯式轉換const char *
類型的操作:
class X
{
public:
explicit operator const char*() const {
return "a";
}
operator std::string() {
return "c";
}
};
這告訴編譯器只允許對std::string
進行隱式轉換,並且當您要調用該特定運算符時,需要顯式轉換為const char *
。
最后要注意的一點是:如果你正在設計其他會消耗這個特定類的類或方法,那么另一個嘗試就是通過為class X
提供重載而不是將X
轉換為其他class X
來反轉它們的使用方式。
總是很好地考慮API的替代方法。
如果在char * cast上使用explicit
關鍵字,則默認轉換為std :: string。
class X
{
public:
explicit operator const char*() const {
return "a";
}
operator std::string() {
return "c";
}
};
之后你的演員陣容:
X x;
std::string s = "";
s = x;
將成功(如果他想使用其他演員,你的類的用戶將需要指定char * cast)
無論如何,作為你班級的用戶,如果兩個演員都是明確的,我寧願選擇,所以我知道什么時候正在進行演員表演
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.