std :: endl не работает с перегруженным оператором & lt; & lt; хотя реализована не шаблонная функция

у меня есть немного Logging::Logger класс со следующими функциями:

template<typename T>
const Logger& Logger::operator<<(const T& in) const {
// ...
return *this;
}

const Logger& Logger::operator<<(std::ostream& (*os)(std::ostream&)) {
// ...
return *this;
}

И следующий код:

loggerInstance << "ID: " << 5 << endl;

И я получаю следующую ошибку, хотя все операторы, кажется, реализованы:

ошибка C2678: двоичная<<‘: не найдено оператора, который занимает левую руку
операнд типа ‘const Logging :: Logger’ (или нет приемлемого
преобразование)

Конечно, без endl все работает.

Я посмотрел на следующий ответ:

std :: endl имеет неизвестный тип при перегрузке оператора<<

Что мне не хватает?

0

Решение

Потому что ваши перегруженные операторы возвращают const Logger &следует, что они должны быть const методы класса, чтобы вы могли связать их вместе:

const Logger& Logger::operator<<(std::ostream& (*os)(std::ostream&)) const

Однако лучше бы их не было const ученики и вернули Logger &вместо:

template<typename T> Logger& Logger::operator<<(const T& in)

Logger& Logger::operator<<(std::ostream& (*os)(std::ostream&))

Это было бы потому, что, по-видимому, operator<< будет модифицировать Logger Например, в некотором роде. Если нет, вы можете использовать const объекты и методы, здесь.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector