2012-03-13 2 views
0

Я работаю над домашним заданием, где нам не разрешено использовать какие-либо STL-контейнеры. Моя реализация LinkedList представляет собой набор узлов, соединенных вместе с указателями. У меня есть еще один класс под названием ContinuousList, у которого есть элемент данных LinkedList, чьи узлы содержат указатели на узлы в других других LinkedLists. Я пытаюсь назначить возвращаемое значение функции, которая возвращает указатель на узел на переменную, которая также является указателем на узел, но он говорит, что это неверно, и я не понимаю, почему я не могу сделать что.ошибка C2440: '=': не может конвертировать из 'Node <ValueType> *' to 'Node <ValueType> *'

template <typename ValueType> 
struct Node 
{ 
    Node(); 
    std::string m_key; 
    ValueType m_value; 
    Node<ValueType>* m_next; 
}; 

Связанный список классов:

template <typename ValueType> 
class LinkedList 
{ 
public: 
    Node<ValueType>* begin() 
    { 
     return m_head; 
    } 
private: 
    Node<ValueType>* m_head; 
}; 

ContinuousList:

template <typename ValueType> 
class ContinuousList 
{ 
public: 
    ValueType* iterate(std::string& key) 
    { 
     m_curr = m_collection.begin(); // Error occurs here 

     ... 
    } 
private: 
    LinkedList<Node<ValueType>*> m_collection; 
    Node<ValueType>* m_curr; 
}; 

Полное сообщение об ошибке

1>   error C2440: '=' : cannot convert from 'Node<ValueType> *' to 'Node<ValueType> *' 
1>   with 
1>   [ 
1>    ValueType=Node<bool> * 
1>   ] 
1>   and 
1>   [ 
1>    ValueType=bool 
1>   ] 
1>   Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 
1>   while compiling class template member function 'bool *ContinuousList<ValueType>::iterate(std::string &)' 
1>   with 
1>   [ 
1>    ValueType=bool 
1>   ] 
1>   see reference to class template instantiation 'ContinuousList<ValueType>' being compiled 
1>   with 
1>   [ 
1>    ValueType=bool 
1>   ] 
+0

Вам не хватает точек с запятой в конце объявления класса, может быть, просто скопировать-вставить ошибку? –

+0

Какой компилятор вы используете? Можете ли вы опубликовать полный тестовый файл? –

+0

Да, это была просто ошибка, когда я пытался удалить ненужные биты кода. Я использую Visual Studio 2010 под Windows. Я добавил полный текст сообщения об ошибке в OP, если это вообще поможет. Компилятор немедленно сбой, когда я пытаюсь построить ContinuousList test_results; – flurry

ответ

6
LinkedList<Node<ValueType>*> m_collection; 

это

делает m_head быть

 Node<Node<ValueType>*>* 

Который не то, что вы хотите.

m_curr = m_collection.begin() 
    Node<ValueType> = Node<Node<ValueType>*>* 

если

Node<Node<ValueType>*>* 

было то, что вы хотите, использовать

m_collection.begin() -> m_value;

или использовать

LinkedList<ValueType>, 

и он возвращает узел

Хотя я может быть просто очень устала .... = D

+0

В других новостях, Node <обрабатывается как html-теги, кажется –

+0

Оба ответа были замечательные, но у вас меньше репутации, поэтому я принял ваши :) – flurry

4

Сообщение об ошибке я получаю от GCC является:

cannot convert ‘Node<Node<int>*>*’ to ‘Node<int>*’ in assignment 

, который немного яснее, чем глупость, которую дает ваш компилятор.

m_collection содержит узлы, обернутые в узлы. В зависимости от того, что вы планируете делать с ним, возможно, это должно быть только LinkedList<ValueType>, или, возможно, назначение должно быть m_curr = m_collection.begin()->m_value.

Кроме того, ContinuousList::iterate должен почти наверняка принять свой аргумент по ссылке const.

+0

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

0

В LinkedList определении вы предполагаете ValueType быть параметром Node, но в ContinuousList вы даете Node<ValueType> в качестве параметра в LinkedList шаблона:

template <typename ValueType> 
class ContinuousList 
{ 
// (...) 
    LinkedList<Node<ValueType>*> m_collection; 
    Node<ValueType>* m_curr; 
}; 

так что ваш LinkedList фактически выглядит как:

template <typename ValueType> 
class LinkedList 
{ 
public: 
    Node<Node<ValueType> >* begin() 
    { 
     return m_head; 
    } 
private: 
    Node<Node<ValueType> >* m_head; 
}; 

и это obvioulsy недействительно, если вы хотите сделать это:

/*Node<ValueType>* */ m_curr = /* Node<Node<ValueType> >* */ m_collection.begin(); 
Смежные вопросы