如何创建 std::vector 支持 initializer_list 的子类?
How to create std::vector subclass with initializer_list support?
我正在尝试创建继承自 std::vector 的 MyVector class(添加一些有用的方法)。一切正常,但无法使用 initializer_list:
进行初始化
std::vector<int> a = { 4, 2 }; // OK
MyVector<int> b = { 4, 2 }; // Error
VS2015和gcc都不允许编译:
error: could not convert '{2, 3, 4}' from '<brace-enclosed initializer list>' to 'MyVector<int>'
为什么会这样?我尝试使用 initializer_list 参数显式添加构造函数解决了问题(请参阅下面的代码),但为什么呢?为什么不继承自std:vector?
template <class T>
class MyVector : public std::vector<T>
{
public:
// Why is this constructor needed???
MyVector(const std::initializer_list<T>& il)
: std::vector<T>(il)
{
}
};
P.S。我不想添加此构造函数以避免编写任何其他构造函数...
因为构造函数在您指定之前不会被继承。
这不是特定于初始化列表:
struct A
{
A() = default;
A(int x) {}
};
struct B : A
{};
int main()
{
B b{3}; // nope!
}
用using
语句继承构造函数,像这样:
template <class T>
class MyVector : public std::vector<T>
{
using std::vector<T>::vector;
};
顺便说一句,您可能希望考虑将 Alloc
模板参数设置为 MyVector
,而不是强制使用 vector 的默认值。
对于 base-class 构造函数,C++11 允许 class 指定将继承 base class 构造函数。
因此,在您的情况下,您可以使用 std::vector<T>::vector;
来指定它
template <class T>
class MyVector : public std::vector<T>
{
using std::vector<T>::vector;
};
我正在尝试创建继承自 std::vector 的 MyVector class(添加一些有用的方法)。一切正常,但无法使用 initializer_list:
进行初始化 std::vector<int> a = { 4, 2 }; // OK
MyVector<int> b = { 4, 2 }; // Error
VS2015和gcc都不允许编译:
error: could not convert '{2, 3, 4}' from '<brace-enclosed initializer list>' to 'MyVector<int>'
为什么会这样?我尝试使用 initializer_list 参数显式添加构造函数解决了问题(请参阅下面的代码),但为什么呢?为什么不继承自std:vector?
template <class T>
class MyVector : public std::vector<T>
{
public:
// Why is this constructor needed???
MyVector(const std::initializer_list<T>& il)
: std::vector<T>(il)
{
}
};
P.S。我不想添加此构造函数以避免编写任何其他构造函数...
因为构造函数在您指定之前不会被继承。
这不是特定于初始化列表:
struct A
{
A() = default;
A(int x) {}
};
struct B : A
{};
int main()
{
B b{3}; // nope!
}
用using
语句继承构造函数,像这样:
template <class T>
class MyVector : public std::vector<T>
{
using std::vector<T>::vector;
};
顺便说一句,您可能希望考虑将 Alloc
模板参数设置为 MyVector
,而不是强制使用 vector 的默认值。
对于 base-class 构造函数,C++11 允许 class 指定将继承 base class 构造函数。
因此,在您的情况下,您可以使用 std::vector<T>::vector;
template <class T>
class MyVector : public std::vector<T>
{
using std::vector<T>::vector;
};