2012-03-13 53 views
0

STLコンテナの使用が許可されていない宿題に取り組んでいます。私のLinkedListの実装は、ポインタと一緒にチェーンされたノードの集合です。私はContinuousListと呼ばれる別のクラスを持っています。このクラスには、LinkedListというデータメンバがあり、そのノードには他のLinkedListのノードへのポインタが含まれています。私はNodeへのポインタを返す関数の戻り値をNodeへのポインタである変数に代入しようとしていますが、それは無効であると言っていますし、なぜ私はできないのか分かりませんそれ。エラーC2440: '=': 'ノード<ValueType> *'から 'ノード<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

はい、それは無関係のコードビットを削除しようとしていたときにエラーに過ぎませんでした。私はWindowsでVisual Studio 2010を使用しています。私は完全にエラーメッセージのテキストをOPに追加しました。 ContinuousListを構築しようとするとコンパイラはすぐに失敗します test_results; – flurry

答えて

6
LinkedList<Node<ValueType>*> m_collection; 

この

はm_headはあなたが望むものではありません

 Node<Node<ValueType>*>* 

も行っています。

Node<Node<ValueType>*>* 

は、あなたが望んでいた

m_curr = m_collection.begin() 
    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という参照で取ります。LinkedList定義では

+0

あなたはそれがまさに問題でした。私は、最初のポインタの後に別のステップがあることを完全に忘れていました。 – flurry

0

あなたはNodeパラメータであることをValueTypeを想定したが、ContinuousListにあなたがLinkedListテンプレートパラメータとしてNode<ValueType>を与える:

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

とこれを行うときは無効です:

/*Node<ValueType>* */ m_curr = /* Node<Node<ValueType> >* */ m_collection.begin(); 
関連する問題