二进制“<<”:未找到接受类型为 '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 值,这不是你想要的)。
有一个函数获取 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 值,这不是你想要的)。