Вопрос:
В приведенном ниже коде вывод типа аргумента шаблона кажется неудачным для первого образца, но не для второго образца. Я не понимаю, почему первый образец не выводит T = char
. Я бы подумал, что T
может быть выведен при преобразовании из "foo"
в std::bacis_string<T>
, но даже если это не сработало, я предоставляю второй аргумент функции, который, я думаю, явно сдерживал бы T
до char
. Почему это не удается?
#include <iostream>
#include <string>
template <typename T>
void print(const std::basic_string<T>& a, const std::basic_string<T>& b)
{
std::cout << a << b << std::endl;
}
int main()
{
std::string bar = "bar";
print("foo", bar);
}
Ошибка:
string.cpp:14:5: error: no matching function for call to 'print'
print("foo", bar);
^~~~~
string.cpp:6:6: note: candidate template ignored: could not match
'basic_string<type-parameter-0-0, char_traits<type-parameter-0-0>,
allocator<type-parameter-0-0> >' against 'char const[4]'
void print(const std::basic_string<T>& a, const std::basic_string<T>& b)
^
1 error generated.
#include <iostream>
#include <string>
template <typename T>
void print(const std::basic_string<T>& a, const std::basic_string<T>& b)
{
std::cout << a << b << std::endl;
}
int main()
{
std::string foo = "foo";
std::string bar = "bar";
print(foo, bar);
}