В:
#include <string>
void f( char const*, char const* = "" ) {
}
template<class StringType1,class StringType2> inline
void g( StringType1 const &s1, StringType2 const &s2 = "" ) {
f( s1.c_str(), s2.c_str() );
}
template<class StringType> inline
void h( StringType const &s1, StringType const &s2 = "" ) {
f( s1.c_str(), s2.c_str() );
}
int main() {
std::string s;
g( s ); // error: no matching function for call to ‘g(std::string&)’
h( s ); // OK
return 0;
}
компилятор не соответствует вызову g()
, потому что он имеет 2 аргумента шаблона, но он просто соответствует h()
. Почему?
К вашему сведению: моя кодовая база фактически использует несколько узкоспециализированных строковых классов, поэтому я хочу обеспечить максимальную гибкость, когда первый и второй аргументы могут быть разных типов строк.