Я написал шаблонный класс «Узел» для двусвязного списка.
Заголовочный файл:
template< class T >
class Node
{
public:
Node();
~Node();
Node<T>* GetNext();
Node<T>* GetPrev();
void SetNext( Node<T>* pNode );
void SetPrev( Node<T>* pNode );
void SetData( T& data );
T* GetData();
private:
Node<T>* p_Next;
Node<T>* p_Prev;
T* p_Data;
};template< class T >
Node<T>::Node() : p_Next(NULL), p_Prev(NULL), p_Data(NULL)
{
}
//======================================================================================
template< class T >
Node<T>::~Node()
{
if( p_Data != NULL)
delete p_Data;
p_Next = NULL;
p_Prev = NULL;
}
//======================================================================================
template< class T >
Node<T>* Node<T>::GetNext()
{
return p_Next;
}
//======================================================================================
template< class T >
Node<T>* Node<T>::GetPrev()
{
return p_Prev;
}
//======================================================================================
template< class T >
void Node<T>::SetData( T& data )
{
if(p_Data == NULL)
p_Data = new T;
*p_Data = data;
}
//======================================================================================
template< class T >
T* Node<T>::GetData()
{
return p_Data;
}
Когда я пытаюсь скомпилировать его, Visual Studio выдает следующие синтаксические ошибки в строке, в которой есть реализация конструктора.
error C2143: syntax error : missing ';' before '<'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2988: unrecognizable template declaration/definition
error C2059: syntax error : '<'
error C2588: '::~Node' : illegal global destructor
fatal error C1903: unable to recover from previous error(s); stopping compilation
Я не могу определить какие-либо синтаксические ошибки, как указано выше. Пожалуйста, помогите мне, что я делаю не так? Заранее спасибо.
Похоже, вы не включили какое-либо определение для NULL.
Пожалуйста, подумайте об использовании nullptr
вместо. В VS2010 вам может понадобиться добавить определение для этого, но при переходе на полностью совместимый с C ++ 11 компилятор вы будете использовать ключевое слово C ++, которое было разработано для этой цели.
Других решений пока нет …