1

私は次のコードを持っています:

inline bool match(const std::wstring & text1, const std::wstring & text2)
{
    return match(text1.c_str(), text2.c_str());
}

inline bool match(const std::wstring & text1, const wchar_t * text2)
{
    return match(text1.c_str(), text2);
}

inline bool match(const wchar_t * text1, const std::wstring & text2)
{
    return match(text1, text2.c_str());
}

inline bool match(const wchar_t * text1, const wchar_t * text2)
{
    return !wcscmp(text1, text2);
}

そして私は得ています:

error C2666: 'match' : 3 overloads have similar conversions
1>   could be 'bool match(const wchar_t *,const std::wstring &)'
1>   or       'bool match(const std::wstring &,const wchar_t *)'
1>   or       'bool match(const std::wstring &,const std::wstring &)'

wstring と wchar_t * の間に暗黙的な変換があってはなりません (そうすべきでしょうか?)。

前もって感謝します

4

3 に答える 3

4

4 番目のオーバーロードは、最初に表示されるようにリストの一番上に移動する必要があります。

最初の 3 つのオーバーロードはすべて 4 番目のオーバーロードを呼び出そうとしますが、まだ宣言されていないため、オーバーロードの解決中に見つかりません。


std::wstringには、 aconst wchar_t*を に暗黙的に変換できる変換コンストラクターがありますstd::wstring。本当の問題はオーバーロードの順序ですが、それはあいまいさの原因の一部です。

4 番目のオーバーロードは、最初の 3 つのオーバーロードの呼び出しによっては呼び出されませんがmatch、3 番目のオーバーロードの呼び出しにはあいまいさしかありません。理由は次のとおりです。

inline bool match(const std::wstring & text1, const std::wstring & text2) // (1)
inline bool match(const std::wstring & text1, const wchar_t * text2)      // (2)
inline bool match(const wchar_t * text1, const std::wstring & text2)      // (3)
inline bool match(const wchar_t * text1, const wchar_t * text2)           // (4)

その時点で可視という名前の関数が 1 つしかないためmatch(1)の呼び出しにあいまいさはありません。match

(2)は(1)よりも引数に適しているためmatch(2)の呼び出しにはあいまいさはありません。

  • (2)を呼び出すには、最初の引数でstd::wstring変換コンストラクターを呼び出す必要があり、2 番目の引数は完全に一致する必要があります。

  • (1)を呼び出すには、両方の引数に対して変換コンストラクターを呼び出す必要があります。

(3) では、使用可能な 3 つのオーバーロードのいずれも「最適」ではないため、あいまいさが生じます。

  • (1)を呼び出すには、両方の引数に対して変換コンストラクターを呼び出す必要があります。

  • (2)を呼び出すには、最初の引数に対して変換コンストラクターを呼び出す必要があり、2 番目の引数は完全に一致します。

  • (3)を呼び出すには、最初の引数は完全に一致しますが、変換コンストラクターを 2 番目の引数に対して呼び出す必要があります。

これらの 3 つのいずれも、他の 2 つよりも明確に優れているわけではありません。

(4)が他のオーバーロードの前に宣言されるように移動された場合、 (1)(2)、および(3)で行われた呼び出しに明確に一致します。これは、3 つのケースすべてで両方の引数が完全に一致するためです。 .

于 2011-04-04T17:04:41.093 に答える
2

C++ はいくつかの 1 パラメーター コンストラクターを暗黙的なコンバーターとして使用するためです。たとえば、std::wstring には wstring(wchar_t*) コンストラクターが必要です。

于 2011-04-04T17:06:01.590 に答える
0

wstring (単なる basic_string<> です) には、単一の const wchar_t* パラメーターを持つ ctor があります。これにより、const wchar_t* から wstring への暗黙的な変換が可能になります。ヘッダファイルから、

typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstring;

// TEMPLATE CLASS basic_string
template<class _Elem, class _Traits, class _Ax> 
    class basic_string : public _String_val<_Elem, _Ax>
{
       .........

    basic_string(const _Elem *_Ptr) : _Mybase()
    {   // construct from [_Ptr, <null>)
        _Tidy();
        assign(_Ptr);
    }

   .........
}
于 2011-04-04T17:11:30.453 に答える