与模板函数不匹配
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
编译器不知道
StringType2
应该是什么。您需要使用以下内容来调用它:才能使其正常工作。
The compiler has no idea what
StringType2
is supposed to be. You would need to call it with something like:to get it to work correctly.
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.