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,因为目标平台不支持更新的编译器.
我正在使用VC++ 2008
这意味着您可能无法访问C++ 11.构造函数不是继承的,在C++ 11之前,甚至没有办法指定应该继承的c'tor .在C++ 03中,你可以告诉我两个选项:
重新定义所有std::vector的构造函数,并将它们转发给基类c'tor.这很脆弱,并且可能无法很好地升级您的工具链.我之所以这么说,是因为std::vectorC++ 03和C++ 11之间的构造函数的定义发生了变化.你需要诉诸一些不愉快才能使它发挥作用.
使用别名而不是继承:
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.而且它更加适合工具链升级.