0

これは、テンプレート クラスとそのコンストラクターのコードです。要素が複雑なテンプレート型であるベクターを初期化できません。

template <class Key, class Obj>
class HashTable{
    typedef int T;  
    typedef pair<const Key, Obj> Entry;
    typedef list<Entry> Bucket;
    typedef vector<Bucket> BktArray;
private:
    T n, nbuckets;
    BktArray a;
public:
    HashTable(T capacity = 199){
        n = 0;
        nbuckets = capacity;
        Bucket b();
        a = vector<Bucket>(capacity, b);
    }
};

行に「呼び出しに一致する関数がありません」というメッセージが表示されます。

a = vector<Bucket>(capacity, b);

「容量」要素を含むようにベクトルを初期化したいと思います。

4

1 に答える 1

3

Bucket b();インスタンスを返す関数を宣言します。ここで必要なものではありません(したがって、タイプが一致しません)。も不要です。それがないコンストラクターは正しいことを行います(=デフォルトでその要素を構築します)。bBucketbvector

より一般的には、ここでは初期化子リストを絶対に使用する必要があります。したがって、コードを次のように書き換えます。

HashTable(T capacity = 199)
    : n(), nbuckets(capacity), a(vector<Bucket>(capacity))
{ }

また、T型エイリアスとして forを持つことintはかなり誤解を招くので、お勧めしません。このコンテキストでの標準型名は になりますが、 ( )ではなく、符号なし型にsize_typeする必要があります。signedint

于 2013-07-14T19:24:36.263 に答える