gpt4 book ai didi

c++ - 子类化 STL 容器 : Range Constructors don't work

转载 作者:太空宇宙 更新时间:2023-11-04 15:31:30 24 4
gpt4 key购买 nike

许多 STL 容器都有一个范围构造函数,您可以使用它来初始化容器元素:

char ary[] = {'a', 'b', 'c'};
vector<char> v(ary, ary + 3);

我将特定的 STL 容器子类化,只是为了默认使用自定义分配器:

template<class _Ty, class _Ax = stl_allocator<_Ty> >
class xvector
: public std::vector<_Ty, _Ax>
{
};

这很好用,但我不能再使用范围构造函数了:

xvector<char> v2(ary, ary + 3);

生成以下错误:

error C2661: 'xvector<_Ty>::xvector' : no overloaded function takes 2 arguments
with
[
_Ty=char
]

但是,我可以使用 assign 方法:

xvector<char> v3;
v3.assign(ary, ary + 3);

有人可以解释为什么 range-constructor 不起作用而 assign 方法起作用吗?我使用的是 VC++ 2008,据我所知,范围构造函数的参数列表和分配方法完全相同。

更新感谢您的回答,但对我来说,关键是我忘记了构造函数不是继承的,因此只有默认构造函数可用(它与范围构造函数没有任何关系)。

我还应该提到我被迫坚持使用 VS2008/C++ 03,因为不幸的是目标平台不支持更新的编译器。

最佳答案

I'm using VC++ 2008

这意味着您可能无法访问 C++11。构造函数不是继承的,在 C++11 之前甚至没有办法指定一个 c'tor 应该 被继承。据我所知,在 C++03 中你有两个选择:

  1. 重新定义所有std::vector的构造函数,并将它们转发给基类 c'tor。这很脆弱,并且可能无法很好地升级您的工具链。我这么说是因为 std::vector 的定义的构造函数在 C++03 和 C++11 之间发生了变化。你需要诉诸一些不愉快的事情才能让它发挥作用。

  2. 使用别名而不是继承:

    template<class Ty, class Ax = stl_allocator<Ty> >
    struct xvector
    {
    typedef std::vector<Ty, Ax> type;
    };

    您不能使用 xvector<...>不再直接使用,而必须使用 xvector<...>::type ,但是您通过这种方式得到的类型 std::vector 。而且它对工具链升级更加友好。

关于c++ - 子类化 STL 容器 : Range Constructors don't work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50964777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com