6

std::string 型の変換関数を含む次のクラスを考えてみましょう。

class SomeType
{
    public:

    SomeType(char *value)
    {
        _str = value;
    }

    operator std::string()
    {
        return std::string(_str);
    }

    private:
    char *_str;
};

次のスニペットは、次のエラーでコンパイルに失敗します: 演算子 "==" がこれらのオペランドに一致しません

int main(int argc, char* argv[])
{
    SomeType a("test");

    if (a == std::string("test")) // ERROR on this line
    {
        int debug = 1;
    }

    return 0;
}

std::string オペランドを受け入れる operator== メソッドを定義できることはわかっていますが、変換関数が機能しないのはなぜですか?

4

2 に答える 2

8

問題は、 std::string が実際にはテンプレートであるため、比較演算子もテンプレートであると思います。その場合、私が思い出した標準では、必要な引数に対して暗黙的な変換は行われないと述べられています。つまり、呼び出されるには、自分で SomeType を文字列にキャストする必要があります。

有効な C++ の項目 46 に記載されているとおり:

[...]、テンプレート引数の推論中に暗黙的な型変換が考慮されないためです。一度もない。そのような変換は関数呼び出し中に使用されますが、関数を呼び出す前に、どの関数が存在するかを知る必要があります。[...]

詳細については、こちらをご覧ください。

于 2013-07-15T00:11:21.367 に答える
4

std::string実際には typedef ですstd::basic_string<char, i_do_not_remember>

テンプレート 1operator ==だけを取得することはありませんstd::string

template<...>
bool operator (basic_string<...>& a, basic_string<...>& b) {
    //
}

ただし、テンプレートの種類はここでは推測できません。手動でキャストできます:

if (static_cast<std::string>(a) == std::string("test")) 
于 2013-07-15T00:07:05.190 に答える