Оператор C++ << перегрузка потока с использованием шаблонов
Я пытаюсь перегрузить оператор << для ostream, чтобы сделать механизм записи в файл журнала. В рамках проекта CExportFunctions я могу log << "xxx"
, Однако, когда я попытался выполнить то же самое в другом проекте (CCallMethods), я не могу записать в файл. Компиляция была в порядке. Нет ошибок Но Entered processMessage()
не было записано в файл. Может ли кто-нибудь помочь, пожалуйста?
Project A - CExportFunctions.h:
#ifdef DLLDIR_EX
#define DLLDIR __declspec(dllexport) // export DLL information
#else
#define DLLDIR __declspec(dllimport) // import DLL information
#endif
...
class DLLDIR CExportFunctions
{
public:
...
ofstream stream;
};
Project A - CExportFunctions.cpp:
#include "CExportFunctions.h"
...
//! write to log file
template<typename T> CExportFunctions& operator<<(CExportFunctions& stream, T val)
{
...
stream.stream.open("D:/Logger/logs.txt", ios::out | ios::app);
stream.stream << << val << std::endl;
stream.stream.close();
return stream;
}
//! save scenario dialog
void CExportFunctions::saveScenario()
{
CExportFunctions log;
log << "Entered saveScenario()";
...
}
Project B - CCallMethods.cpp:
#include "CExportFunctions.h"
void CCallMethods::processMessage()
{
...
CExportFunctions log;
log.stream << "Entered processMessage()";
}
1 ответ
Вы вызываете разные функции. В вашем сценарии сохранения:
//! save scenario dialog
void CExportFunctions::saveScenario()
{
CExportFunctions log;
log << "Entered saveScenario()";
...
}
Вы на самом деле звоните
template<typename T> CExportFunctions& operator<<(CExportFunctions& stream, T val)
Но это второй:
void CCallMethods::processMessage()
{
...
CExportFunctions log;
log.stream << "Entered processMessage()";
}
Ты звонишь operator<<(std::ofstream&, const char*)
... который не включает в себя открытие файла. Я думаю, вы просто имели в виду:
log << "Entered processMessage()";