Ваш код объявляет operator<<
как функцию-член, поэтому он фактически принимает указатель this
в качестве первого аргумента и ostream
в качестве второго.Вместо этого она должна быть бесплатной функцией:
template<class NType> class Node {
public:
NType data;
Node *prev, *next;
};
//Note how this is declared outside of the class body, so it is a free function instead of a memberfunction
template<class NType> inline std::ostream& operator<<(std::ostream& out, const Node<NType>& val){
out << val.data;
return out;
}
, однако, если вашему operator<<
нужен доступ к личным данным, вам нужно объявить его как функцию друга:
template<class NType> class Node {
public:
NType data;
Node *prev, *next;
friend std::ostream& operator<<(std::ostream& out, const Node& val){
out << val.data;
return out;
}
};
Сейчасдля вашего вывода: если ваш operator<<
был вызван, компилятор будет знать тип NType
и будет делать правильные вещи при потоковой передаче члена data
.Однако, поскольку ваш operator<<
не должен был работать (как написано), и, похоже, он выдал вам адреса памяти в качестве вывода, я бы предположил, что у вас есть что-то вроде следующего:
Node* n = new Node();
std::cout<<n;
//When it should be:
std::cout<<*n;
Теперь просто для любопытства:вы сами реализуете то, что выглядит как связанный список, вместо того, чтобы просто использовать std::list
?
Edit: Теперь, когда мы можем увидеть тестовый пример, кажется, что предположения о том, как operator<<
былзвонил было правильно.Выходные данные должны быть изменены на:
std::cout << "Node 1: " << *n1 << std::endl;
std::cout << "Node 2: " << *n2 << std::endl;
для фактического вызова operator<<
для Node
вместо общего для T*