使用单花括号而不是双花括号初始化 std::vector 替换
Initializing a std::vector replacement with single curly braces instead of double curly braces
我有一个类似于下面的代码:
namespace mine
{
template<class T>
using _vector = std::vector<T, my_allocator<T>>;
template<class T>
class myvector : public _vector<T>{};
};
这在大多数情况下都可以用作我自己的 std::vector 替代品,但它不能像正常 std::vector:[=13= 那样用列表初始化它]
#include "myvector.h"
void foo(void)
{
std::vector<int> vi = { 1, 2, 3 };
mine::myvector<int> mvi = { { 1, 2, 3 } };
}
注意我使用了双花括号来编译它。那么,我在这里缺少什么?而且,更重要的是,我能做些什么来初始化 mine::myvector 就像我对普通 std::vector 所做的那样?
请注意,您的 class 没有定义或继承任何构造函数。
所以暂时我想知道你的代码是如何编译的。
您的代码使用 aggregate initialization。由于您没有任何字段只是 public 继承,聚合初始化的第一个参数被传递给祖先。这就是为什么你需要双括号的原因。
修复它的一种方法是从基数 class 到 inherit constructors。所以你的 class 看起来像这样:
template<class T>
class myvector : public _vector<T>{
using _vector<T>::_vector;
};
IMO 更好的解决方案是不定义 class 但为类型定义别名:
template<class T>
using myvector = _vector<T>;
我有一个类似于下面的代码:
namespace mine
{
template<class T>
using _vector = std::vector<T, my_allocator<T>>;
template<class T>
class myvector : public _vector<T>{};
};
这在大多数情况下都可以用作我自己的 std::vector 替代品,但它不能像正常 std::vector:[=13= 那样用列表初始化它]
#include "myvector.h"
void foo(void)
{
std::vector<int> vi = { 1, 2, 3 };
mine::myvector<int> mvi = { { 1, 2, 3 } };
}
注意我使用了双花括号来编译它。那么,我在这里缺少什么?而且,更重要的是,我能做些什么来初始化 mine::myvector 就像我对普通 std::vector 所做的那样?
请注意,您的 class 没有定义或继承任何构造函数。 所以暂时我想知道你的代码是如何编译的。
您的代码使用 aggregate initialization。由于您没有任何字段只是 public 继承,聚合初始化的第一个参数被传递给祖先。这就是为什么你需要双括号的原因。
修复它的一种方法是从基数 class 到 inherit constructors。所以你的 class 看起来像这样:
template<class T>
class myvector : public _vector<T>{
using _vector<T>::_vector;
};
IMO 更好的解决方案是不定义 class 但为类型定义别名:
template<class T>
using myvector = _vector<T>;