двоичный файл «<<»: не найден оператор, который принимает левый операнд типа «std :: basic_ostream»' - PullRequest
0 голосов
/ 05 октября 2018

Есть функция, которая получает 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 перегруженный оператор <<:</p>

ostream& operator<< (ostream& (*pf)(ostream&));

Так в чем же проблема и как ее исправить?

1 Ответ

0 голосов
/ 05 октября 2018

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

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

(Как указано в комментариях nm , вы также не передаете функцию << но его возвращаемое значение, которое не соответствует вашим ожиданиям.

...