C++ 如何在具有依赖元素类型的模板类构造函数中初始化向量
这是我为模板类及其构造函数编写的代码。我无法初始化元素为复杂模板类型的向量C++ 如何在具有依赖元素类型的模板类构造函数中初始化向量,c++,templates,types,vector,constructor,C++,Templates,Types,Vector,Constructor,这是我为模板类及其构造函数编写的代码。我无法初始化元素为复杂模板类型的向量 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:
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);
}
};
模板
类哈希表{
typedef int T;
typedef对输入;
类型定义列表存储桶;
typedef向量BktArray;
私人:
T n,nbuckets;
BktArray a;
公众:
哈希表(T容量=199){
n=0;
nbuckets=容量;
桶b();
a=矢量(容量,b);
}
};
我在行中得到“调用没有匹配函数”:
a = vector<Bucket>(capacity, b);
a=向量(容量,b);
我想初始化向量以包含“capacity”元素。Bucket b()
声明一个名为b
的函数,该函数返回一个Bucket
实例。这里不是您想要的(因此是不匹配的类型)b
也是不必要的,没有它的vector
构造函数做正确的事情(=它默认构造它的元素)
更一般地说,这里绝对应该使用初始化列表。因此,请按如下方式重写代码:
HashTable(T capacity = 199)
: n(), nbuckets(capacity), a(vector<Bucket>(capacity))
{ }
哈希表(T容量=199)
:n(),nbuckets(容量),a(向量(容量))
{ }
另外,将T
作为int
的类型别名是非常误导人的,我不建议这样做。此上下文中的标准类型名称将是size\u type
,但它应该是无符号类型,而不是(signed
)int
Bucket b()
声明一个名为b
的函数,该函数返回一个Bucket
实例。这里不是您想要的(因此是不匹配的类型)b
也是不必要的,没有它的vector
构造函数做正确的事情(=它默认构造它的元素)
更一般地说,这里绝对应该使用初始化列表。因此,请按如下方式重写代码:
HashTable(T capacity = 199)
: n(), nbuckets(capacity), a(vector<Bucket>(capacity))
{ }
哈希表(T容量=199)
:n(),nbuckets(容量),a(向量(容量))
{ }
另外,将
T
作为int
的类型别名是非常误导人的,我不建议这样做。此上下文中的标准类型名称为size\u type
,但它应该是无符号类型,而不是(signed
)int
,谢谢!成功了。然而,我不太明白。这段代码工作得很好:“对p(1,2);向量v(10,p);”那么我的代码不也应该在类似的逻辑中工作吗?@PulkitYadav logic不幸与此无关。这是语言中的一种模糊性,其原因是将新特性移植到以前不支持它们的语言(C)上,并试图保持向后兼容。因此,我们只能用武断的规则来打破这种模棱两可的局面。这是其中之一。这就是我们所知道的。谢谢!成功了。然而,我不太明白。这段代码工作得很好:“对p(1,2);向量v(10,p);”那么我的代码不也应该在类似的逻辑中工作吗?@PulkitYadav logic不幸与此无关。这是语言中的一种模糊性,其原因是将新特性移植到以前不支持它们的语言(C)上,并试图保持向后兼容。因此,我们只能用武断的规则来打破这种模棱两可的局面。这是其中之一。这就是我们所知道的。