Я создал класс шаблона для узла в связанном списке, и я пытаюсь его выводить его содержимое в выходной поток, перегружая < <. Однако мой текущий код:Перегрузка << оператор в классах шаблонов
#include <iostream>
using namespace std;
template<class NType> class Node;
template<class NType>
class Node {
private:
void deletePointer(NType* p);
public:
NType data;
Node *prev, *next;
template<typename T>
struct is_pointer { static const bool value = false; };
template<typename T>
struct is_pointer<T*> { static const bool value = true; };
Node();
Node(NType data);
~Node();
};
int main() {
Node<int> *n1 = new Node<int>();
Node<int> *n2 = new Node<int>(10);
std::cout << "Node 1: " << n1 << std::endl;
std::cout << "Node 2: " << n2 << std::endl;
}
template<class NType> inline std::ostream & operator << (std::ostream& out, const Node<NType> &node){
out << node.data;
return out;
}
template<class NType> inline Node<NType>::Node()
:data(NULL), prev(NULL), next(NULL)
{
}
template<class NType> inline Node<NType>::Node(NType data)
:data(data), prev(NULL), next(NULL)
{
}
template<class NType> inline Node<NType>::~Node(){
if(is_pointer<NType>::value){
deletePointer(&data);
} else {
return;
}
}
template<class NType> inline void Node<NType>::deletePointer(NType* p){
delete p;
}
Выводит места памяти, а не данные в узлах. Это происходит с примитивными типами, такими как int
и тому подобное, как будто он не знал, какие данные были в контейнере NType
.
Node 1: 0x741010
Node 2: 0x741030
Node 3: 0x741070
Node 4: 0x741090
Я пытался не используя typename
, а не class
, но до сих пор нет костей ... Есть ли способ, чтобы динамически выяснить, какой тип шаблона используется и литым или что-то перед вставкой? Я знаю, что могу сделать тонну избыточного кода для всех примитивов, но это кажется расточительным и ненужным.
Если это поможет любому, я компиляции на Arch Linux x64 с GCC v4.6.2 20111223
Edit: Так много людей упоминания о нем. Я также попытался поставить класс снаружи в качестве друга и как автономную функцию, ни одна из которых не работает, потому что поток выдает адрес, а не данные, независимо от того, где я его помещал. Нет доступа к личным значениям данных, так что это нормально, чтобы он не был другом.
Edit: Тестовый пример: http://ideone.com/a99u5 также обновленный источник выше.
Редактировать: Добавлена оставшаяся часть моего кода, чтобы помочь Аарону в его понимании кода.
То, как вы это сделали, требует 'SomeNode << cout', что явно не то, что вы имели в виду. 'ostream & operator <<' должен всегда быть свободной функцией, потому что вы хотите «ostream» на LHS. Фиксирование, которое не решит вашу проблему обязательно, но ... –
Производите тестовую проверку, пожалуйста.http://ideone.com –