Существует функция, которая получает в качестве аргументов 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
user3336051 5 Окт 2018 в 12:04

1 ответ

Лучший ответ

Ваша функция не соответствует ostream& (*pf)(ostream&), но ostream& (*pf)(ostream&, int). Придется как-то связать второй аргумент. Однако использовать лямбды для этой цели будет сложно, потому что, если вы захватите (и используете) что-либо, например {{X2 }} в вашем случае лямбда больше не может распадаться на указатель функции , как в противном случае .

Я не вижу реентерабельного способа использования перегрузки манипулятора с параметрами времени выполнения, такими как n, поскольку все, что соответствует ostream& (*pf)(ostream&), не может иметь состояния (или, в лучшем случае, полагаться на какой-то глобальный, что уродливо и небезопасно) и также не имеет возможности получить эту дополнительную информацию с помощью параметров.

(Как n.m. указывалось в комментариях, вы также не передаете функцию в <<, а ее возвращаемое значение, а это не то, что вы намеревались).

2
Max Langhof 5 Окт 2018 в 09:25