Я написал программу на C++ и скомпилировал ее с помощью gcc 7.3. Это простая программа, которая записывает строку в файл. Но ошибка компилятора генерируется только при компиляции с использованием gcc 7.3. С помощью старого компилятора 4.8.5 программа успешно скомпилирована.
Ошибка компилятора следующая
In member function 'void CDemoMap::saveFile(std::__cxx11::string&)': ..\src\VerifyProgram.cpp:51:9: error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream}' and 'std::ostream {aka std::basic_ostream}') cout << print(coutFile)
Есть ли кто-нибудь, кто может помочь мне решить эту проблему? Код следующий
#include <map>
#include <iostream>
#include <ostream>
#include <fstream>
using namespace std;
class CDemoMap
{
public:
map<int,int> m_sMap;
void saveFile(std::string &);
std::ostream& print(std::ostream &s);
};
std::ostream& operator << (ostream& s, const CDemoMap &m)
{
if (m.m_sMap.size())
{
s << "-----------------\nSOCKET FQDN MAP\n-----------------\n";
s << "fqdn host:port timestamp\n";
for (map<int,int>::const_iterator iter = m.m_sMap.cbegin(); iter !=
m.m_sMap.cend(); ++iter)
{
s << iter->first << " " << (iter->second);
}
s << endl;
}
return s;
}
std::ostream& CDemoMap::print(std::ostream &s)
{
return s << (*this);
}
void CDemoMap::saveFile(std::string & test)
{
char outFile[50];
snprintf(outFile, sizeof(outFile), "Data:%s", test.c_str());
std::ofstream coutFile;
coutFile.open("Test.txt", std::ios::app);
cout << print(coutFile);
coutFile.close();
}
int main() {
CDemoMap cSocket;
string str = "Hello";
cSocket.saveFile(str);
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
return 0;
}
Почему это компилируется в компиляторе 4.8.5? Компилятор 4.8.5 не поддерживает C++11 по сравнению с 7.3.1. Что изменилось в операторе ostream в последнем стандарте?
Под 4.8.5 следующая строка:
cout << print(coutFile);
переводится на:
void* v = print(coutFile);
std::cout << v;
потому что до C++11 был оператор, преобразующий ostream в void*
, чтобы проверить, нет ли в потоке ошибок по ссылке:
operator void*() const; (1) (until C++11) explicit operator bool() const; (2) (since C++11) Checks whether the stream has no errors.
1) Returns a null pointer if fail() returns true, otherwise returns a non-null pointer. This pointer is implicitly convertible to bool and may be used in boolean contexts.
2) Returns true if the stream has no errors and is ready for I/O operations. Specifically, returns !fail().
Начиная с C++11 код не может скомпилироваться, поскольку преобразование в void* отключено.
Почему вы хотите передать возвращаемый тип печати - ostream другому ostream? Просто должно быть:
print(coutFile); // there is no need to pass ostream to cout
Кажется, что конфигурация ostream& ожидает файл, когда вы используете опцию печати