2016-07-20 22 views
0

Visual Studio 2015をC++の実装に使用すると、insertHelper()にコンパイルエラーが発生します。C2678:バイナリ検索ツリーの挿入時のエラーC++

Insert Helperは、以下に示す再帰関数です。

template < typename DataType, typename KeyType > 
    void BSTree<DataType, KeyType>::insertHelper(BSTreeNode *&p, 
    const DataType &newDataItem) 

    // Recursive helper function for insert. Inserts newDataItem in 
    // the subtree pointed to by p. 

{ 
    if (p == NULL) { 
     p->dataItem = newDataItem; 
     p->left = NULL; 
     p->right = NULL; 
    } 
    else { 
     if (p->dataItem < newDataItem) { // <- error triggers here 
      insertHelper(p->left, newDataItem); 
     } 
     else { 
      insertHelper(p->right, newDataItem); 
     } 
    } 
} 

挿入ヘルパーはここに挿入することによって呼び出されます。

template < typename DataType, typename KeyType > 
    void BSTree<DataType, KeyType>::insert(const DataType &newDataItem) 

// Inserts newDataItem into a tree. If an data item with the same key 
// as newDataItem already exists in the tree, then updates that 
// data item's data with newDataItem's data. 

{ 
    insertHelper(root, newDataItem); 
} 

そして、私の木のヘッダファイルの簡易版はこちらです。

#ifndef BSTREE_H 
#define BSTREE_H 
#include <stdexcept> 
#include <iostream> 
using namespace std; 

template < typename DataType, class KeyType > // DataType : tree data item 
class BSTree          // KeyType : key field 
{ 
public: 

    // Constructor 
    BSTree();       // Default constructor 
    // Binary search tree manipulation operations 
    void insert(const DataType& newDataItem); // Insert data item 
protected: 
    class BSTreeNode     // Inner class: facilitator for the BSTree class 
    { 
    public: 

     // Constructor 
     BSTreeNode(const DataType &nodeDataItem, BSTreeNode *leftPtr, BSTreeNode *rightPtr); 

     // Data members 
     DataType dataItem;   // Binary search tree data item 
     BSTreeNode *left, // Pointer to the left child 
      *right; // Pointer to the right child 
    }; 

    // Recursive helpers for the public member functions -- insert 
    // prototypes of these functions here. 
    void insertHelper(BSTreeNode *&p, const DataType &newDataItem); 

    // Data member 
    BSTreeNode *root; // Pointer to the root node 
}; 

#endif // define BSTREE_H 

試験データと初期化:

class TestData 
{ 
    public: 

    void setKey (int newKey) 
     { keyField = newKey; } // Set the key 

    int getKey() const 
     { return keyField; }  // Returns the key 

    private: 

    int keyField;    // Key for the data item 
}; 

int main() 
{ 
    BSTree<TestData,int> testTree; // Test binary search tree 
    TestData testData;    // Binary search tree data item 
} 

私はif (p->dataItem < newDataItem){}を使用することはできませんなぜ私は理解していません。私はif (p.dataItem < newDataItem){}と、ちょうどif (dataItem < newDataItem){}を試しました。そして、私はこのバグでどこでも速くなりません。どんな助けもありがとう。全くオペレータはタイプの左側BSTオペランド 『TESTDATA』をとる見つからない(または全く許容される変換はありません):

C2678:「<」バイナリ

エラーが読み取ります。

BSTree<TestData,int> testTree; 

+0

エラーメッセージは何だ、とあなたは 'insert'を呼び出すときに' DataType'は何ですか? – songyuanyao

+0

'TestData'とは何ですか?どのように' operator <'を定義しましたか? – aschepler

+0

'DataType'は、入力が何であっても単に型名です。この場合は 'int'です。 – Callat

答えて

1
if (p->dataItem < newDataItem) { // <- error triggers here 

ベースは、我々はp->dataItemnewDataItemはタイプTestDataであることを知っています。

したがって、上記の比較は

if (p->dataItem.operator<(newDataItem)) 

に展開今、再びエラーメッセージを見てみましょう:

binary '<': no operator found which takes a left-hand BST operand of type 'TestData' (or there is no acceptable conversion). 

それはバイナリ「<」演算子を探していました。あなたは1つを提供していないので、言語は要求された<の比較を実装できません。

class TestData 
{ 
    public: 

    void setKey (int newKey) 
     { keyField = newKey; } // Set the key 

    int getKey() const 
     { return keyField; }  // Returns the key 

    bool operator < (const TestData& rhs) const 
     { return keyField < rhs.keyField; } 

    private: 

    int keyField;    // Key for the data item 
}; 

または

class TestData 
{ 
    public: 

    void setKey (int newKey) 
     { keyField = newKey; } // Set the key 

    int getKey() const 
     { return keyField; }  // Returns the key 

    friend bool operator < (const TestData&, const TestData&); 

    private: 

    int keyField;    // Key for the data item 
}; 

bool operator < (const TestData& lhs, const TestData& rhs) 
{ 
    return lhs.keyField < rhs.keyField; 
} 

ライブデモ:http://ideone.com/Y7JGCD

+0

これが私の問題を解決したことを確認できます。ありがとうございました。そして、私は、 'operator <'をオーバーロードする必要性に基づいて、フォローアップの質問をしています。私はまた、演算子= 'をオーバーロードする必要があることがわかります。 keyFieldのために返される型が 'int'であるべきですか?クラス名のために 'TestData'ですか? – Callat

+1

@KazRodgers DataType :: operator =(single =)はDataType&を返す必要があります。 'データ型&演算子=(int値){keyField =値;これを返す。 } '。 http://stackoverflow.com/questions/4421706/operator-overloadingも参照してください。 – kfsone

関連する問題