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
をoperator string()
に従ってstring
に変換してからoperator < (string, string)
を使用するのはなぜですか?
+1この回答は正しいです。 'string :: operator <()'は 'const string&'ではなく 'basic_string <>'として引数をとります。 'operator <'をグローバルにオーバーロードすると、それは動作します。 http://www.ideone.com/vMERa – iammilind
'std :: string'は' std :: basic_string 'の単なるtypedefです。 'typedef'は新しい型を導入しないので、オーバーロードには影響しません。 –
MSalters
基本的な問題は、 'template bool operator <(std :: basic_string const&lhs、std :: basic_string const & rhs); 'が失敗します。' basic_string '_equals_' SimpleStruct'の 'charT'はありません。実際には、それをオーバーロードセットから削除します。 –
MSalters