Я столкнулся с этой проблемой с шаблонами. Вот более общее решение, которое я должен был использовать:
template class <T>
class myClass
{
int myField;
// Helper function accessing my fields
void toString(std::ostream&) const;
// Friend means operator<< can use private variables
// It needs to be declared as a template, but T is taken
template <class U>
friend std::ostream& operator<<(std::ostream&, const myClass<U> &);
}
// Operator is a non-member and global, so it's not myClass<U>::operator<<()
// Because of how C++ implements templates the function must be
// fully declared in the header for the linker to resolve it :(
template <class U>
std::ostream& operator<<(std::ostream& os, const myClass<U> & obj)
{
obj.toString(os);
return os;
}
Сейчас: функция * Мой ToString() не может быть рядный, если он будет спрятан в CPP. * Вы застряли с некоторым кодом в заголовке, я не мог избавиться от него. * Оператор вызовет метод toString(), он не является встроенным.
Тело оператора < < может быть объявлено в статье friend или вне класса. Оба варианта уродливы.:(
Может быть, я недоразумение или что-то отсутствует, но только вперед объявить шаблон оператор не связывает в НКУ
Это тоже работает:.
template class <T>
class myClass
{
int myField;
// Helper function accessing my fields
void toString(std::ostream&) const;
// For some reason this requires using T, and not U as above
friend std::ostream& operator<<(std::ostream&, const myClass<T> &)
{
obj.toString(os);
return os;
}
}
Я думаю, вы также можете избегайте проблем с шаблонами, вызывающих объявления в заголовках, если вы используете родительский класс, который не является шаблоном для реализации оператора < <, и используйте метод virtual toString().
Кроме того, он объявляет его как функцию друга и определяет его как я mber. – asaelr