2012-03-13 2 views
2

Я пытаюсь создать дважды связанный список, и я получаю эту ошибку:ошибка C2440: «=»: не удается преобразовать из «ListNode <T> *» до «ListNode <T> *»

error C2440: '=' : cannot convert from 'ListNode<T> *' to 'ListNode<T> *' 

и я действительно не знаю, почему. Может кто-то может мне помочь?

template <class T> 
class ListNode 
{ 
private: 
    //Données membres 
    T m_Value; 
    ListNode<T> *m_Next; 
    ListNode<T> *m_Prev; 
public: 
    //Constructeur 
    ListNode() 
    { 
     m_Value = NULL; 
     m_Next = NULL; 
     m_Prev = NULL; 
    } 

    ListNode<T>(T _Value) 
    { 
     m_Value = _Value; 
     m_Next = NULL; 
     m_Prev = NULL; 
    } 

    //Accesseurs 
    T getValue() const 
    { return m_Value; } 

    void setValue(T _Value) 
    { m_Value = _Value; } 

    ListNode<T>* getNext() const 
    { return m_Next; } 

    void setNext(ListNode *_NextNode) 
    { m_Next = _NextNode; } 

    ListNode<T>* getPrev() const 
    { return m_Prev; } 

    void setPrev(ListNode *_PrevNode) 
    { m_Prev = _PrevNode; } 
}; 

template <class T> 
class List 
{ 
private: 
    //Données membres 
    int m_Compte; 
    ListNode<T> *m_Current; 
    ListNode<T> *m_Head; 
    ListNode<T> *m_Last; 

... 

Вот функция, которые вызывают ошибку

template <class T> 
void operator+=(T _newValue) 
{ 
     Where the error is 

Эта линия является неисправна одна. Я пытаюсь создать новый узел и влиять на текущий узел, который является указателем на ListNode

m_Current = new ListNode<T>(_newValue); 

    if (!m_Head) 
    { 
     m_Head = m_Current; 
    } 
    else 
    { 
     m_Last->setNext(m_Current); 
     m_Current->setPrev(m_Last); 
     m_Last = m_Current; 
    } 
    ++m_Compte; 
    return; 
} 

ответ

3
template <class T> // <------ 'T' 
class List 
{ 
    ... 
    template <class T> // <------- 'T' again ? 
    void operator+=(T _newValue); 
}; 

Кажется, что T для ListтенейT для operator +=. Вы можете использовать typename U для operator += и попробуйте попробовать.
Кроме того, вы уверены, что хотите новый тип для operator +=? Или вы собираетесь использовать тот же тип, что и List<T>.

На стороне записки, типичный синтаксис operator += является:

List& operator += (const List &copy) 
{ 
    ... 
    return *this; 
} 
0

Я не могу сказать, потому что все определение класса для закрывающей скобки не здесь, то ли оператор + = внутри или вне класса определение.

Если он внутри, и вы определяете его как встроенный, то избавитесь от шаблона прямо над оператором + =. Весь класс покрывается декларацией шаблона на самом верху.

Если он определен вне класса, вам нужен List :: operator + =.

Смежные вопросы