Оператор Log4cxx << вызывает нарушение прав доступа - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть проект DLL в VS2008, который заставляет мое приложение выбрасывать нарушение доступа. Я отладил и обнаружил, что в строке Log4cxx, LOG4CXX_DEBUG(logger, myMessage << doubleA << double B); оператор << вызывает проблему. Это касается всех уровней ведения журнала. Я хотел бы сделать эту работу, переопределив оператор <<. Но это кажется сложнее, чем сказано. Я искал это в StackOverflow и пытался до сих пор: </p>

Я пытался переопределить его в пространстве имен Log4cxx:

namespace log4cxx { namespace helpers {
    ostream& operator<<(ostream& os, const double& a);
} }

Это не компилируется:

more than one operator "<<" matches these operands:
            function "log4cxx::helpers::operator<<(std::ostream &os, const double &a)"
            function "std::basic_ostream<_Elem, _Traits>::operator<<(double _Val) [with _Elem=char, _Traits=std::char_traits<char>]"
            operand types are: std::basic_ostream<char, std::char_traits<char>> << const double

Я попытался переопределить в пространстве имен Std (я знаю, что это не рекомендуется):

namespace std {
   ostream& operator<<(ostream& os, const double& a);
}

Это выдает:

more than one operator "<<" matches these operands:
            function "std::operator<<(std::ostream &os, const double &a)"
            function "std::basic_ostream<_Elem, _Traits>::operator<<(double _Val) [with _Elem=char, _Traits=std::char_traits<char>]"
            operand types are: std::basic_ostream<char, std::char_traits<char>> << const double

Любая идея, как я могу перегрузить оператор правильнои заставить его работать ??

Еще одна вещь, которую я попробовал: Я пытался создать строку сообщения, прежде чем она перейдет к строке регистратора. string myMessage = "myMessage" + double A + doubleB; и затем использование этой строки в качестве LOG4CXX_DEBUG(logger, myMessage); Это ничего не делает. Получил то же нарушение доступа. И я попытался ...

std::ostringstream os;
    os << "myMessage here << doubleX<< ", valuey=" << doubleY;
    LOG4CXX_DEBUG(logger, os.str());

Здесь тоже самое нарушение прав доступа. Мне удалось собрать log4cxx с VS2008, но я подумал, что это может быть проблемой, так как я использовал тот, который построен с VS2005.

Не могли бы вы помочь здесь? Что еще я могу сделать, чтобы сделать эту работу?

1 Ответ

0 голосов
/ 04 ноября 2019

std уже имеет перегрузку для двойной, вы не можете ввести другую. То, что вы можете сделать, это перегрузить его в классе.

...