полосатой вниз версии моей проблемы:Не удалось вывести аргумент шаблона с станд :: basic_string
Я хочу объединить эти две функции:
void Bar(const std::string &s);
void Bar(const std::wstring &s);
..into одной шаблонных функции:
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)
и (2)
.
Редактировать
(2)
и (3)
работают. Я заявляю, что это неправильно в моем компиляторе (не так, как в моем вопросе):
template <class CharType>
void Foo(const std::basic_string<char> &s);
Извините.
Насколько я могу видеть в реализации VS в 'станд :: string' не на самом деле' 'basic_string является' basic_string <голец, char_traits , Распределитель > ', так что я думаю, что это не работает, потому что не хватает какой-то аргументы шаблона. –
Raxvan
Отредактировал свой ответ, может подойти вам сейчас –