二进制“<<”:未找到接受类型为 'std::basic_ostream<char, std::char_traits<char>>' 的左侧操作数的运算符

binary '<<' : no operator found which takes a left-hand operand of type 'std::basic_ostream<char, std::char_traits<char>>'

有一个函数获取 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 studio2015编译报错:

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&));

问题是什么以及如何解决?

您的函数不匹配 ostream& (*pf)(ostream&),而是 ostream& (*pf)(ostream&, int)。您将不得不以某种方式绑定第二个参数。但是,为此目的使用 lambda 会很困难,因为如果您捕获(和使用)任何东西,such as n in your case, the lambda can no longer decay to a function pointer as it otherwise could.

我没有看到一种可重入的方式,你可以使用像 n 这样的运行时参数的操纵器重载,因为任何匹配 ostream& (*pf)(ostream&) 的东西都不能有状态(或者最多依赖于一些全局的,它丑陋且不安全),也无法通过参数获取额外信息。

(正如 n.m. 在评论中指出的那样,您也没有将函数传递给 << 而是它的 return 值,这不是你想要的)。