1

私の問題のストライプ化されたバージョン:

これら2つの機能をマージしたい:

void Bar(const std::string &s);
void Bar(const std::wstring &s);

..1 つのテンプレート化された関数に:

template <class CharType>
void Foo(const std::basic_string<CharType> &s);

Fooとのよう(1)に呼び出せると思っていたのです(2)が、驚いたことにうまくいきませんでし(3)た。

(1) Foo("my string");
(2) Foo(std::string("my string"));
(3) Foo(std::basic_string<char>("my string"));

constパラメータの修飾子を削除してs、参照( )を削除するか、の代わりに で&呼び出してみましたが、すべて同じ結果になりました。lvaluesrvalues

コンパイラ (gcc と VS の両方 - したがって、標準に準拠した動作であると確信しています) は、 のテンプレート引数を推測できませんFoo。もちろん、のように呼び出しても機能しFooますFoo<char>(...)

(3)したがって、特に呼び出しは、呼び出し元のパラメーター オブジェクトの型と関数の引数の型の間で 1 対 1 の型であるため、これがなぜなのかを理解したいと思います。

第二に、これに対する回避策が必要です: 1 つのテンプレート化された関数を使用できるようにし、それを および のように呼び出すことができるようにし(1)ます(2)

編集

(2)そして(3)仕事をする。私はコンパイラで間違っていると宣言していました(私の質問とは異なります):

template <class CharType>
    void Foo(const std::basic_string<char> &s);

申し訳ありません。

4

1 に答える 1