调整模板对象的矢量大小时出错

时间:2012-08-14 20:58:35

标签: c++ templates hash vector resize

我正在尝试创建模板对象的矢量向量。当我尝试调整内部向量的大小时,错误发生,我无法做出错误消息的头部或尾部。我不知道从何处获取HashTable :: Item :: Item。有什么建议吗?

  

/ usr / include / c ++ / 4.4.6 / bits / stl_vector.h(552):错误:没有构造函数的实例“HashTable :: Item :: Item [with Key = int,Value = Varvalue]”匹配参数列表          resize(size_type __new_size,value_type __x = value_type())

     detected during:
       instantiation of "void std::vector<_Tp, _Alloc>::resize(std::vector<_Tp, _Alloc>::size_type={size_t={unsigned long}}, std::vector<_Tp, _Alloc>::value_type) [with _Tp=HashTable<int, Varvalue>::Item, _Alloc=std::allocator<HashTable<int, Varvalue>::Item>]" at line 118 of "main.cc"

以下是相关代码:

#define VECLEN 16
class Varvalue
{
public:
        char data[32];
};

template class HashTable { private: class Item { public: bool valid; Key key; Value value; Item *next;
Item(const Key k, const Value v, Item *b = 0, bool val = true): key(k), value(v), next(b), valid(val) {} };

vector<vector<Item> > table;
    int tableSize;
    HashTable(const int s): tableSize(s)
    {
            table.resize(tableSize);
            for(int i=0; i<table.size(); i++)
                  table[i].resize(VECLEN);       // <<-- error line 118
    }

}

int main() { HashTable<int, Varvalue> htable(nkeys); }

2 个答案:

答案 0 :(得分:6)

Item没有默认构造函数,因此您需要向resizevector<Item>提供2个参数。后一个参数应该是用于填充向量的“默认”Item

答案 1 :(得分:2)

在C ++中,当您声明一个类而没有提供构造函数时,会自动生成一个默认构造函数(没有任何输入参数)。当您使用输入参数声明构造函数时,您不会获得默认构造函数。在你的情况下,你确实为类item声明了一个构造函数,它需要k和v作为输入参数,但你没有给它们,所以要么声明一个没有item输入参数的构造函数,要么提供k和诉