与模板函数不匹配

发布于 2024-10-12 21:34:15 字数 716 浏览 2 评论 0原文

In:

#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() 匹配得很好。为什么?

仅供参考:我的代码库实际上使用了几个高度专业化的字符串类,因此我希望允许最大的灵活性,其中第一个和第二个参数可能是不同的字符串类型。

In:

#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;
}

the compiler doesn't match the call to g() because it has 2 template arguments, but it matches h() just fine. Why?

FYI: My codebase actually uses several, highly-specialized string classes, so I want to allow for maximal flexibility where the first and second arguments might be of different string types.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

木緿 2024-10-19 21:34:15

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

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

才能使其正常工作。

The compiler has no idea what StringType2 is supposed to be. You would need to call it with something like:

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

to get it to work correctly.

薔薇婲 2024-10-19 21:34:15

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

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

编辑:显然默认参数不会参与模板类型推导或其他内容。无论如何,您将需要使用不同的技术来完成此任务,例如部分专业化。

g() is rejected because StringType2 is deduced to be a const char[] (or some similar variant of it) that does not offer the c_str() member method. h() matches fine because you forced StringType to be std::string in both cases.

You will need to look into more detailed metaprogramming techniques, but this should be perfectly possible.

Edit: Apparently default args won't participate in template type deduction, or something. In any case, you will need to use a different technique to accomplish this, like partial specialization.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文