私の問題のストライプ化されたバージョン:
これら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
、参照( )を削除するか、の代わりに で&
呼び出してみましたが、すべて同じ結果になりました。lvalues
rvalues
コンパイラ (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);
申し訳ありません。