Ошибка при попытке сохранить содержимое файла с помощью ostream - PullRequest
0 голосов
/ 07 апреля 2019

Я написал программу на C ++ и скомпилировал ее, используя gcc 7.3.Это простая программа, которая записывает строку в файл.Но ошибка компилятора генерируется только при компиляции с использованием gcc 7.3.Используя старый компилятор 4.8.5, программа успешно скомпилирована.

Ошибка компилятора следующая

В функции-члене void CDemoMap :: saveFile (std :: __ cxx11 ::string &) ': .. \ src \ VerifyProgram.cpp: 51: 9: ошибка: нет совпадения для' operator << '(типы операндов:' std :: ostream {aka std :: basic_ostream} 'и' std :: ostream){aka std :: basic_ostream} ') cout << print (coutFile) </p>

Кто-нибудь может помочь мне решить эту проблему?Код следующий

#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;
}

1 Ответ

3 голосов
/ 07 апреля 2019

под 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) Возвращает нулевой указатель, если fail () возвращает true, в противном случае возвращает ненулевой указатель. Этот указатель неявно конвертируется в bool и может использоваться в логических контекстах.

2) Возвращает true, если у потока нет ошибки и готов к операциям ввода-вывода. В частности, возвращает! Fail ().

Начиная с C ++ 11 код не может быть скомпилирован, потому что преобразование в void * отключено.

Почему вы хотите передать возвращаемый тип печати - ostream другому ostream? Это просто должно быть:

print(coutFile); // there is no need to pass ostream to cout
...