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;
上
エラーメッセージは何だ、とあなたは 'insert'を呼び出すときに' DataType'は何ですか? – songyuanyao
'TestData'とは何ですか?どのように' operator <'を定義しましたか? – aschepler
'DataType'は、入力が何であっても単に型名です。この場合は 'int'です。 – Callat