у меня есть немного 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 имеет неизвестный тип при перегрузке оператора<<
Что мне не хватает?
Потому что ваши перегруженные операторы возвращают 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
объекты и методы, здесь.
Других решений пока нет …