【发布时间】:2020-09-22 11:42:42
【问题描述】:
我正在尝试制作 std::array 的包装器,以按照this answer 的建议执行边界检查。这是我的代码:
template <typename T, size_t N>
class Array : private std::array<T, N> {
public:
using std::array<T, N>::array;
T operator[](size_t i) {
return this->at(i);
}
T operator[](size_t i) const {
return this->at(i);
}
};
int main() {
Array<int, 3> arr = {0,0,0};
}
当我尝试运行它时,我收到以下错误:error: no matching constructor for initialization of 'Array<int, 3>'。
如果我省略 using std::array<T, N>::array; 行并公开继承它,则代码有效,但不建议使用此选项。
我在这里缺少什么?为什么我的班级不能创建这样的实例?
提前致谢!
【问题讨论】:
-
与其继承
std::array,不如考虑启用边界检查,如果你的标准库支持的话。错误信息似乎来自 Clang;如果将它与 libstdc++ 一起使用,则正确的标志是-D_GLIBCXX_DEBUG。 -
array实际上并没有采用initializer_list的构造函数。 -
澄清一下:它改用
aggregate initialization。 -
@HolyBlackCat 这种方法对我来说似乎更优雅,因为我不依赖不同的标准库版本...... @ChrisMM 我理解并将编辑这个问题。不过,我仍然不明白为什么我的班级不能以这种方式继承
aggregate_initialization。 -
@gustavo,请参阅下面我答案的第二部分。
标签: c++ inheritance stl containers private