我想定义一个行为如下的重载/模板化函数Stringify():
a
引用了从类A
派生的任何类的对象,
Stringify(a)
应该返回"I am an A"
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<<