Не соответствует шаблонной функции - PullRequest
3 голосов
/ 20 января 2011

В:

#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(). Почему?

К вашему сведению: моя кодовая база фактически использует несколько узкоспециализированных строковых классов, поэтому я хочу обеспечить максимальную гибкость, когда первый и второй аргументы могут быть разных типов строк.

Ответы [ 2 ]

7 голосов
/ 20 января 2011

Компилятор не знает, каким должен быть StringType2.Вам нужно было бы назвать его как-то так:

   g<std::string, std::string>( s );

, чтобы заставить его работать правильно.

0 голосов
/ 20 января 2011

g () отклонено, потому что StringType2 определяется как const char [] (или некоторый подобный его вариант), который не предлагает метод члена c_str ().h () отлично подходит, потому что вы заставили StringType быть std :: string в обоих случаях.

Вам необходимо изучить более подробные методы метапрограммирования, но это должно быть вполне возможно.

Редактировать: Очевидно, что аргументы по умолчанию не будут участвовать в выводе типа шаблона или чем-то подобном.В любом случае для этого вам нужно будет использовать другую технику, например, частичную специализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...