10
請考慮以下代碼。爲什麼編譯器不執行類型轉換?
#include <iostream>
#include <string>
struct SimpleStruct
{
operator std::string() { return value; }
std::string value;
};
int main()
{
std::string s; // An empty string.
SimpleStruct x; // x.value constructed as an empty string.
bool less = s < x; // Error here.
return 0;
}
此代碼無法在g ++或Microsoft Visual C++中編譯。編譯器給出的錯誤報告是no match for operator '<' in 's < x'
。現在的問題是,爲什麼編譯器不能根據簡單轉換SimpleStruct x
到string
定operator string()
然後用operator < (string, string)
?
+1,這個答案是正確的。 'string :: operator <()'不會將參數作爲'const string&',而是'basic_string <>';如果你全局超載'operator <',那麼它就可以工作。 http://www.ideone.com/vMERa – iammilind
Eh,'std :: string'只是'std :: basic_string'的一個typedef。 'typedef'不會引入新的類型,因此不會影響重載。 –
MSalters
潛在的問題是,charT'的''中模板<類圖表,類TR,類的Alloc>布爾運算符<(標準:: basic_string的<圖表,TR,的Alloc>常量&LHS扣,性病:: basic_string的<圖表, tr,Alloc> const & rhs);'failed。沒有'charT',其中'basic_string'_equals_'SimpleStruct'。這確實將它從過載集中移除。 –
MSalters