尝试使用ostream

时间:2019-04-07 08:22:05

标签: c++ operator-overloading fstream cout ostream

我用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 <<打印(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;
}

1 个答案:

答案 0 :(得分:3)

在4.8.5下的以下行:

 cout << print(coutFile);

被翻译成:

 void* v =  print(coutFile);
 std::cout << v;

因为在C ++ 11之前,有运算符将ostream转换为void*以检查流是否没有错误from reference

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,则返回空指针,否则返回a   非空指针。该指针可以隐式转换为bool和   可以在布尔上下文中使用。

     

2)如果流没有,则返回true   错误,并准备进行I / O操作。具体来说,返回!fail()。

自C ++ 11以来,由于无法转换为void *,因此无法编译代码。

为什么要将打印的返回类型-ostream传递给另一个ostream? 它应该是:

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