Оператор 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()";
Другие вопросы по тегам