1

私は次のインターフェースを持っています

virtual void send_command( const std::string& command, const std::string& key, const std::string& value, bool pipeline = true );    
virtual void send_command( const std::string& command, const std::string& key, bool pipeline = true );
virtual void send_command( const std::string& command, bool pipeline = true );

これは、次のように呼び出す 1 つのクラスに完全に実装されています。

c.send_command("MUTLI");
c.send_command("SET", "foo", "bar");
c.send_command("GET", "foo");
c.send_command("EXEC");

get が呼び出されたメソッド実装を確認すると、3 番目の呼び出し ( GET foo ) が最終的に最後の実装にヒットすることがわかります。

virtual void send_command( const std::string& command, bool pipeline = true );

ここで、「foo」は暗黙的に bool に変換されます。2 番目の実装 (string、string、bool) にヒットする"SET"、"foo"、"bar"についても同じことがカウントされます。

c.send_command("GET", (std::string)"foo");

期待されるメソッドが呼び出されます。

C++11 で gcc (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8) を使用しています。

4

3 に答える 3

4

コンパイラは、UDT への変換よりも からconst char*への変換を優先します ( )。必要に応じて、オーバーロードも追加してください。boolstd::stringconst char*

于 2014-01-16T11:57:14.877 に答える
4

ポインターを暗黙的に変換できるbool(null ではないことをテストする) こと、および文字列リテラルは ではなく、std::stringオンコールにconst char[]崩壊するという事実にぶつかっています。const char*あなたができることは、以下を取る追加のオーバーロードを提供することですconst char*:

void send_command(const std::string& command, const char* key)
{ send_command(command, std::string(key)); }

実際の例

于 2014-01-16T12:00:18.130 に答える
1

過負荷の解決にはいくつかの手順があります。まず、実行可能な関数のセットが選択されます。これらの実行可能な関数には、省略記号やデフォルトの引数を考慮して、呼び出しに十分なパラメーターが必要です。さらに、各引数は、対応するパラメーターの型に変換できる必要があります。あなたにはc.send_command("GET", "foo");実行可能な候補者がいるからです

virtual void send_command( const std::string&, const std::string&, bool);
virtual void send_command( const std::string&, bool);

前者の 3 番目のパラメーターはデフォルト設定されており、文字列リテラル引数はstring const&andに変換できるためboolです。

実行可能なセットを取得した後、コンパイラは必要な引数の変換を調べます。変換なし、組み込み変換、ユーザー定義変換の順に優先されます。この場合、最初の引数の変換は、両方の実行可能な関数で同じです。2 番目の引数については、への変換boolはビルドリンですが、への変換はそうでstring const&はありません。したがってsend_command( const std::string&, bool);、代替手段よりも優先されます。

于 2014-01-16T12:08:55.463 に答える