【问题标题】:How to initialize vector in template class constructor with dependent element types如何在具有依赖元素类型的模板类构造函数中初始化向量
【发布时间】:2013-07-15 03:24:36
【问题描述】:

这是我的模板类及其构造函数的代码。我无法初始化元素为复杂模板类型的向量。

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);

我想初始化向量以包含“容量”元素。

【问题讨论】:

    标签: c++ templates types vector constructor


    【解决方案1】:

    Bucket b(); 声明了一个名为b函数,它返回一个Bucket 实例。不是你想要的(因此类型不匹配)。 b 也是不必要的,没有它的 vector 构造函数会做正确的事情(= 它默认构造它的元素)。

    更一般地说,您绝对应该在此处使用初始化列表。因此,重写你的代码如下:

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

    另外,将T 用作int 的类型别名很容易产生误导,我不建议这样做。此上下文中的标准类型名称是 size_type,但它应该是 unsigned 类型,而不是 (signed) int

    【讨论】:

    • 谢谢!那行得通。不过,我不太明白。此代码工作正常:“pair p(1, 2); vector > v(10, p);"那么我的代码不应该也以类似的逻辑工作吗?
    • @PulkitYadav Logic 不幸与此无关。这是由于将新功能移植到以前不支持它们的语言 (C) 上并试图保持向后兼容而导致的语言中的歧义。结果,我们留下了任意规则来打破歧义。这是其中之一。这被称为most vexing parse
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多