Есть две (почти одинаковых) фунуции с шаблонным параметром:
#include <iostream>
#include <string>
template <typename String = std::string, typename Char = typename String::value_type>
void test1(const std::basic_string<Char>& s) {
std::cout << "test1<Char> = " << s << std::endl;
}
template <typename String = std::string>
void test2(const std::basic_string<typename String::value_type>& s) {
std::cout << "test2<typename String::value_type> = " << s << std::endl;
}
int main() {
test1("test1");
test2("test2");
}
Обьясните пожалуйста, почему test1 не компилируется (в то время как test2 проходит)?
P.S. g++ 6.2 говорит:
cbegin.cpp: In function ‘int main()’: cbegin.cpp:85:18: error: no matching function for call to ‘test1(const char [6])’ test1(«test1»); ^ cbegin.cpp:73:6: note: candidate: template<class String, class Char> void test1(const std::__cxx11::basic_string<Char>&) void test1(const std::basic_string<Char>& s) { ^~~~~ cbegin.cpp:73:6: note: template argument deduction/substitution failed: cbegin.cpp:85:18: note: mismatched types ‘const std::__cxx11::basic_string<Char>’ and ‘const char [6]’