有一个函数将std :: ostream&作为参数并执行一些操作:
inline std::ostream& my_function(std::ostream& os, int n) {
// some operations
return os;
}
还有另一个调用my_function
的函数:
void caller_function(int n) {
std::ostringstream ostsr;
ostsr << my_function(ostsr, n);
}
Visual Studio 2015编译器报告错误:
error C2679: binary '<<' : no operator found which takes a left-hand operand of type 'std::basic_ostream<char, std::char_traits<char>>'
std :: ostringstreamm具有继承和重载的operator<<
,在这种情况下,它需要操纵器函数,操纵器函数是my_function
重载的运算符<<:
ostream& operator<< (ostream& (*pf)(ostream&));
那么问题是什么以及如何解决?
答案 0 :(得分:2)
您的函数与ostream& (*pf)(ostream&)
不匹配,但与ostream& (*pf)(ostream&, int)
不匹配。您将必须以某种方式绑定第二个参数。尽管为此目的使用lambda将会很困难,因为如果您捕获(并使用)such as n
in your case,则lambda将无法再衰减到函数指针as it otherwise could。
我看不到一种可重入的方式,可以在运行时参数(如n
)中使用操纵器重载,因为任何与ostream& (*pf)(ostream&)
匹配的东西都不能具有状态(或充其量依赖于某些全局变量,这很丑陋且不安全),也无法通过参数获取其他信息。
(如注释中的 n.m。所述,您也不会将函数传递给<<
,而是将其返回值传递给您,这不是您想要的)。