不匹配模板功能

时间:2011-01-20 16:33:00

标签: c++ templates

在:

#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 个答案:

答案 0 :(得分:7)

编译器不知道StringType2应该是什么。您需要使用以下内容来调用它:

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

让它正常工作。

答案 1 :(得分:0)

g()被拒绝,因为StringType2被推断为不提供c_str()成员方法的const char [](或其某些类似的变体)。 h()匹配正常,因为在两种情况下都强制StringType为std :: string。

您需要研究更详细的元编程技术,但这应该是完全可能的。

编辑:显然默认args不会参与模板类型扣除等。在任何情况下,您都需要使用不同的技术来完成此操作,例如部分特化。