私はHashTableクラスをテンプレートにしてテンプレートを作成することにしましたが、問題が発生しました。私のHashTable<T>
テンプレートの中にはitems
というBucket
というデータメンバ配列があります。これはHashTable<T>
クラス内の構造体です。 items
を初期化した後、Bucket
のメンバーにテンプレートのコードのうちのどこかにアクセスすることができません。テンプレート内の構造体メンバーにアクセスできない
構造体と変数の定義の前にtypename
とtemplate<class T>
を入れてみましたが、動作させることができませんでした。ここで
'keyValue': undeclared identifier
#ifndef HASH_TABLE_
#define HASH_TABLE_
using namespace std;
#include <iostream>
template<class T>
class HashTable
{
public:
HashTable(int numItems) {
if (numItems <= 0) {
throw std::invalid_argument("Invalid HashTable size");
}
currItems = 0;
//B must be the next prime after 2 * numItems
B = 1000;
items = Bucket[B]; //allocate array of Buckets
items[0].keyVal; //ERROR: undeclared identifier
}
bool insert(T* newItem, int key) {
bool retVal = false;
if (currItems < B && newItem != NULL) { //cannot insert to full HashTable
int index = 0;
items[index].dataPtr = newItem; //ERROR:undeclared
items[index].keyVal = key; //ERROR:undeclared
retVal = true;
currItems++;
}
return retVal;
}
private:
struct Bucket {
T* dataPtr = NULL;
int keyVal = -1;
};
Bucket * items; //array of buckets
int B; //size of itemArray
int currItems; //track number of items in HashTable
};
#endif
私にエラーを与えるのコードスニペットはなぜitems[x]
はitems[x].keyVal
またはitems[x].dataPtr
が使用できないようにバケツに、アクセスしないのですか?私はitems = new Bucket[B]
のような異なるタイプの初期化を試しましたが、どちらもうまくいきませんでしたので、テンプレート側にエラーがあると仮定しています。
私はどんな指針もありがとう!
このコードは、nextPrimeおよびgetOpenBucketの実装が不足しているためコンパイルされません。また、アイテムを適切に割り当てることはできません(new演算子を使用するか、さらには生のポインタをスマートなものに変更してください)。ここにテンプレートの問題はありません –
nextPrimeとgetOpenBucketを削除しました。新しい[]を使うと、私は現在持っているものの代わりに 'items = new Bucket [B]'を使うことを意味しますか?それは私に過去の同じエラーを与えているからです。私はC++ '98 Linuxマシンでコンパイルする必要があるので、スマートポインタを使用することはできません:( – shtuken
テーブルを動的に作成したい場合は、メモリを割り当てる必要があります。あなたは新しいコンパイラを利用できるようになり、新しい標準を使用することができます。そして、このコードではC++ 11の機能を使用しています( "int keyVal = -1;")。 )私はあなたのコードを問題なくコンパイルしています。 –