子类化STL-Containers:范围构造函数不起作用

Kri*_*rid 0 c++ templates stl allocator

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

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

我将特定的STL容器子类化,仅用于默认使用自定义分配器:

template<class _Ty, class _Ax = stl_allocator<_Ty> >
class xvector
    : public std::vector<_Ty, _Ax>
{
};
Run Code Online (Sandbox Code Playgroud)

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

xvector<char> v2(ary, ary + 3);
Run Code Online (Sandbox Code Playgroud)

生成以下错误:

error C2661: 'xvector<_Ty>::xvector' : no overloaded function takes 2 arguments
    with
    [
        _Ty=char
    ]
Run Code Online (Sandbox Code Playgroud)

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

xvector<char> v3;
v3.assign(ary, ary + 3);
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么范围构造函数在赋值方法时不起作用?我正在使用VC++ 2008,从我可以告诉范围构造函数的参数列表和assign方法完全相同.

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

我也应该提到我不得不坚持使用VS2008/C++ 03,因为目标平台不支持更新的编译器.

Sto*_*ica 5

我正在使用VC++ 2008

这意味着您可能无法访问C++ 11.构造函数不是继承的,在C++ 11之前,甚至没有办法指定应该继承的c'tor .在C++ 03中,你可以告诉我两个选项:

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

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

    template<class Ty, class Ax = stl_allocator<Ty> >
    struct xvector
    {
        typedef std::vector<Ty, Ax> type;
    };
    
    Run Code Online (Sandbox Code Playgroud)

    你不能再xvector<...>直接使用xvector<...>::type,而是必须使用,但你用这种方式得到的类型std::vector.而且它更加适合工具链升级.