初始化 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 那样使用列表初始化它:
#include "myvector.h"
void foo(void)
{
std::vector<int> vi = { 1, 2, 3 };
mine::myvector<int> mvi = { { 1, 2, 3 } };
}
请注意,我使用了双大括号来编译它。那么,我在这里错过了什么?而且,更重要的是,我能做些什么来初始化我的::myvector,就像我使用普通的std::vector一样?
请注意,您的类没有定义或继承任何构造函数。 所以目前我想知道你的代码是如何编译的。
代码使用聚合初始化。由于您没有任何字段,只有公共继承,因此聚合初始化的第一个参数将传递给祖先。这就是您需要双牙套的原因。
修复它的一种方法是从基类继承构造函数。所以你的类看起来像这样:
template<class T>
class myvector : public _vector<T>{
using _vector<T>::_vector;
};
https://godbolt.org/z/qH6s_x
IMO 更好的解决方案是不定义类,而是定义类型的别名:
template<class T>
using myvector = _vector<T>;
https://godbolt.org/z/Pt6sRQ
相关文章:
- 将大括号括起来的初始值设定项列表作为结构返回
- std::initializer_list,大括号初始化和标头
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- 初始化 std::vector 替换为单大括号而不是双大括号
- 调用重载的"<大括号括起来的初始值设定项列表>"对于对来说就足够了是模棱两可的
- 为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)
- 使用大括号初始化 std::vector 使用初始值设定项列表
- 标准::在双类和类的 std::p air 上更大
- 使用 std::call_once 实现类似单例的功能
- std::bad_alloc 在大数据集的 Dijkstra 计算期间
- 使用 std::min_element、std::max_element 查找矢量中的最小和最大元素
- 为什么这个复合语句作为用大括号和括号括起来的语句序列似乎不是有效的语句表达式
- 查找 std::vector 中的最小值和最大值 std::p air
- 为什么大括号括起来的初始值设定项列表不适用于 std::array
- 正确的线程调用语法?错误:没有匹配对 std::thread::thread(<大括号括起来的初始值设定项列表>)
- 无法从大括号括起来的初始值设定项列表转换为 std::vector
- 在单步执行 std::function 调用时,如何跳过 std 命名空间中的方法调用?(使用 GDB
- C++中的转义序列用单引号括起来,而不是用双引号括起来
- 如何使用二维大小范围较大的std::向量来管理结构的std::向量
- c++ std::cout当我用单引号括起字符串时打印奇怪的字符