Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在具有依赖元素类型的模板类构造函数中初始化向量_C++_Templates_Types_Vector_Constructor - Fatal编程技术网

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)上,并试图保持向后兼容。因此,我们只能用武断的规则来打破这种模棱两可的局面。这是其中之一。这就是我们所知道的。