二进制'<<':未找到采用'std :: basic_ostream <char,std :: char_traits <char =“” >>“

时间:2018-10-05 09:04:39

标签: c++ compiler-errors operator-overloading ostream ostringstream

有一个函数将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&));

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

1 个答案:

答案 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。所述,您也不会将函数传递给<<,而是将其返回值传递给您,这不是您想要的)。