7
#include <iostream>
using namespace std;

class Foo{

        string _s;
        public:
        Foo(string ss){
                _s = ss;
        }
        Foo& operator=(bool b){
                cout << "bool" << endl;
                return *this;
        }
        Foo& operator=(const string& ss){
                cout << "another one" << endl;
                return *this;
        }
};


int main(){

        Foo f("bar");
        f = "this";
        return 0;

}

オーバーロードされ=た演算子があります。f = "this";オーバーロードを呼び出すステートメントを期待していましoperator=(const string& ss)た。しかし、そうではありません。オーバーロードと呼びますoperator=(bool b)。なんで?

4

4 に答える 4

13

この演算子operator=(const string& ss)は、引数 ( const char*to std::string) のユーザー定義型の変換を必要としますが、boolバージョンには何もないため、より適切に一致します。組み込み型const char[5]からconst char*to への変換が得られboolます。

于 2013-03-04T21:42:39.353 に答える
1

別の回答で指摘されているように、変換にはユーザー定義の変換が含まれているのboolに対し、ユーザー定義の変換は含まれないため、変換へのポインターから文字への変換が推奨std::stringされます。

C ++ 11は、手動タイプ制御を行う機能を提供します。

template<size_t n>
struct enumarated_enum {
private:
  enum empty {};
};

template<bool b, size_t n=0>
using EnableIf = typename std::enable_if< b, typename enumerated_enum<n>::empty >::type;

template<typename String, EnableIf< std::is_convertible< String, std::string >::value >... >
Foo& operator=(String&& s) {
  cout << "string overload" << "\n";
}

// either this:
template<typename Bool, EnableIf< !std::is_convertible< Bool, std::string >::value && std::is_convertible< Bool, bool >::value, 1 >... >
Foo& operator=(Bool&& b) {
  cout << "bool overload" << "\n";
}
// or this:
Foo& operator=(bool b) {
  cout << "bool overload" << "\n";
}

ここで、型に変換できる場合は完全にstd::string一致し、変換できない場合はテンプレートが一致せずstd::string、他のオーバーロードが調べられます。

サポートできるようにしたいタイプが多数ある場合は、実行するオーバーロードを説明する長い論理形式を使用し、他のタイプがそれを受け入れないようにする必要があります(上記のnot構文を使用)。タイプが2つしかない場合、2番目のタイプは従来のオーバーロードである可能性があります。テンプレートのオーバーロードは、従来のオーバーロードと正確に一致しないもので最初にクラックされます...

(2番目のテンプレート引数はenum存在できない番号付きの変数リストです。その唯一の目的は、コンパイラが文句を言わないように2つのテンプレートが十分に異なることを確認することです。)

于 2013-03-04T22:15:50.827 に答える
0

C++ 標準を掘り下げることなく、表面的には、割り当てのオーバーロードを string& と bool で定義しましたが、テストでは char* 配列を割り当てています。

したがって、文字列を定義して割り当てると、期待どおりに機能します。

ここで動作を確認してください:http://codepad.org/owb6noXR

于 2013-03-04T21:47:33.323 に答える
0

他の人が言ったように、これを簡単に修正するにはstd::string、演算子を実行するときに文字列を , にキャストするだけでよいため、C++ は選択するオーバーロードを正確に認識します。

#include <iostream>
using namespace std;

class Foo{

        string _s;
        public:
        Foo(string ss){
                _s = ss;
        }
        Foo& operator=(bool b){
                cout << "bool" << endl;
                return *this;
        }
        Foo& operator=(const string& ss){
                cout << "another one" << endl;
                return *this;
        }
};


int main(){

        Foo f((string)"bar");
        f = (string)"this";
        return 0;

}
于 2013-03-04T22:09:11.707 に答える