通用模板化重载会干扰基类的重载

时间:2019-05-30 03:10:23

标签: c++

我想定义一个行为如下的重载/模板化函数Stringify():

  • 如果a引用了从类A派生的任何类的对象, Stringify(a)应该返回"I am an A"
  • 在调用任何其他类型的值时,请使用stringstream的operator<<将值转换为字符串。例如。 Stringify(10)应该返回"10"

有办法吗?这是我的尝试,但是没有编译:{{1​​}}的默认模板版本 显然阻止使用Stringify的版本(重载或模板专门化) 在派生类const A&的对象上被调用时被发现。

编译错误为:

B

即调用overload_question.cc: In instantiation of ‘std::__cxx11::string Stringify(const T&) [with T = B; std::__cxx11::string = std::__cxx11::basic_string<char>]’: overload_question.cc:63:48: required from here overload_question.cc:26:6: error: no match for ‘operator<<’ (operand types are ‘std::stringstream {aka std::__cxx11::basic_stringstream<char>}’ and ‘const B’) ss << x; ~~~^~~~ 时,它尝试使用通用的默认实现, 哪个当然失败了,因为没有Stringify(b)operator<<作为RHS。

(注意:不能添加B的重载。)

operator<<

0 个答案:

没有答案