子类化 STL 容器:范围构造函数不起作用
Subclassing STL-Containers: Range Constructors don't work
许多 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
]
不过,我可以使用赋值方法:
xvector<char> v3;
v3.assign(ary, ary + 3);
有人可以解释为什么范围构造器不起作用而赋值方法起作用吗?我正在使用 VC++ 2008,据我所知,范围构造函数的参数列表和分配方法完全相同。
更新
谢谢你的回答,但对我来说,关键是我忘记了构造函数不是继承的,所以只有默认构造函数可用(它与范围构造函数没有任何关系)。
我还应该提到我被迫坚持使用 VS2008 / C++ 03,因为不幸的是目标平台不支持更新的编译器。
I'm using VC++ 2008
这意味着您可能无法访问 C++11。构造函数不是继承的,在 C++11 之前甚至没有办法指定 c'tor should 被继承。据我所知,在 C++03 中你有两个选项:
重新定义 std::vector
的所有构造函数,并将它们转发给基础 class 构造函数。这很脆弱,并且可能无法很好地升级您的工具链。我这么说是因为 std::vector
的构造函数的定义在 C++03 和 C++11 之间发生了变化。你需要诉诸一些不愉快的事情才能让它发挥作用。
使用别名而不是继承:
template<class Ty, class Ax = stl_allocator<Ty> >
struct xvector
{
typedef std::vector<Ty, Ax> type;
};
您不能再直接使用 xvector<...>
,而必须使用 xvector<...>::type
,但是您通过这种方式获得的类型 是 std::vector
.而且它对工具链升级更友好。
如解释的那样,从 stl 容器继承是一个坏主意here
但是如果你objective是
using a custom allocator by default
使用 c++11 你可以做到
template<class _Ty, class _Ax = stl_allocator<_Ty> >
using xvector = std::vector<_Ty, _Ax>;
许多 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
]
不过,我可以使用赋值方法:
xvector<char> v3;
v3.assign(ary, ary + 3);
有人可以解释为什么范围构造器不起作用而赋值方法起作用吗?我正在使用 VC++ 2008,据我所知,范围构造函数的参数列表和分配方法完全相同。
更新 谢谢你的回答,但对我来说,关键是我忘记了构造函数不是继承的,所以只有默认构造函数可用(它与范围构造函数没有任何关系)。
我还应该提到我被迫坚持使用 VS2008 / C++ 03,因为不幸的是目标平台不支持更新的编译器。
I'm using VC++ 2008
这意味着您可能无法访问 C++11。构造函数不是继承的,在 C++11 之前甚至没有办法指定 c'tor should 被继承。据我所知,在 C++03 中你有两个选项:
重新定义
std::vector
的所有构造函数,并将它们转发给基础 class 构造函数。这很脆弱,并且可能无法很好地升级您的工具链。我这么说是因为std::vector
的构造函数的定义在 C++03 和 C++11 之间发生了变化。你需要诉诸一些不愉快的事情才能让它发挥作用。使用别名而不是继承:
template<class Ty, class Ax = stl_allocator<Ty> > struct xvector { typedef std::vector<Ty, Ax> type; };
您不能再直接使用
xvector<...>
,而必须使用xvector<...>::type
,但是您通过这种方式获得的类型 是std::vector
.而且它对工具链升级更友好。
如解释的那样,从 stl 容器继承是一个坏主意here
但是如果你objective是
using a custom allocator by default
使用 c++11 你可以做到
template<class _Ty, class _Ax = stl_allocator<_Ty> >
using xvector = std::vector<_Ty, _Ax>;