ошибка C2440: «=»: невозможно преобразовать из «ListNode <T>*» в «ListNode <T>*» - PullRequest
2 голосов
/ 13 марта 2012

Я пытаюсь создать двусвязный список и получаю эту ошибку:

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;
}

Ответы [ 2 ]

3 голосов
/ 13 марта 2012
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 голосов
/ 15 марта 2012

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

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

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

...