重载 operator[] 不断抛出运行时错误
Overloading operator[] keeps throwing a runtime error
好的,所以我正在尝试创建一个矩阵 class,我真的非常希望能够使用括号调用元素。以 mMatrix[x][y] 的风格。
所以我有一个 vector<vector<T>>
成员,当重载 [] 运算符时,我 return 引用了一个 vector<T>
对象。
template<class T>
class Matrix
{
private:
uint32_t DimensionHorizontal;
uint32_t DimensionVertical;
std::vector<std::vector<T>> matrix;
public:
Matrix()
{
DimensionHorizontal = 10;
DimensionVertical = 10;
}
std::vector<T>& operator[] (int index)
{
return matrix.[index];
}
Matrix(int x, int y)
{
DimensionHorizontal = x;
DimensionVertical = y;
}
};
这似乎有效,因为当我创建一个 Matrix 对象并尝试通过执行 Matrix[a][n](在本例中使用整数)添加一个元素时,它编译没有问题。我稍后尝试用 cout 打印出存储在那里的值。
在运行期间,我收到以下错误
表达式:向量第 1455 行的向量下标超出范围。
第 1455 行:
_NODISCARD size_type capacity() const noexcept { // return current length of allocated storage
auto& _My_data = _Mypair._Myval2;
return static_cast<size_type>(_My_data._Myend - _My_data._Myfirst);
}
_NODISCARD _Ty& operator[](const size_type _Pos) noexcept { // strengthened
auto& _My_data = _Mypair._Myval2;
#if _CONTAINER_DEBUG_LEVEL > 0
_STL_VERIFY(
_Pos < static_cast<size_type>(_My_data._Mylast - _My_data._Myfirst), "vector subscript out of range");
#endif // _CONTAINER_DEBUG_LEVEL > 0
return _My_data._Myfirst[_Pos];
}
我有点困惑为什么会这样。我知道我正在尝试越界访问某些东西,或者做一些非法的事情,但是 Matrix[] 应该 return 一个向量,我应该能够再次使用 [] 来访问元素 T(在这个case int),我们将不胜感激。
编辑:
我就是这样使用 class
int main()
{
Matrix<int> a(10, 10);
a[0][0] = 10;
std::cout << a[0][0];
return 0;
}
您需要在构造函数中调整矩阵的大小以匹配作为参数传递的大小。
Matrix(int x, int y) : matrix(x)
{
for( auto& sub : matrix ) {
sub.resize(y);
}
DimensionHorizontal = x;
DimensionVertical = y;
}
好的,所以我正在尝试创建一个矩阵 class,我真的非常希望能够使用括号调用元素。以 mMatrix[x][y] 的风格。
所以我有一个 vector<vector<T>>
成员,当重载 [] 运算符时,我 return 引用了一个 vector<T>
对象。
template<class T>
class Matrix
{
private:
uint32_t DimensionHorizontal;
uint32_t DimensionVertical;
std::vector<std::vector<T>> matrix;
public:
Matrix()
{
DimensionHorizontal = 10;
DimensionVertical = 10;
}
std::vector<T>& operator[] (int index)
{
return matrix.[index];
}
Matrix(int x, int y)
{
DimensionHorizontal = x;
DimensionVertical = y;
}
};
这似乎有效,因为当我创建一个 Matrix 对象并尝试通过执行 Matrix[a][n](在本例中使用整数)添加一个元素时,它编译没有问题。我稍后尝试用 cout 打印出存储在那里的值。
在运行期间,我收到以下错误
表达式:向量第 1455 行的向量下标超出范围。 第 1455 行:
_NODISCARD size_type capacity() const noexcept { // return current length of allocated storage
auto& _My_data = _Mypair._Myval2;
return static_cast<size_type>(_My_data._Myend - _My_data._Myfirst);
}
_NODISCARD _Ty& operator[](const size_type _Pos) noexcept { // strengthened
auto& _My_data = _Mypair._Myval2;
#if _CONTAINER_DEBUG_LEVEL > 0
_STL_VERIFY(
_Pos < static_cast<size_type>(_My_data._Mylast - _My_data._Myfirst), "vector subscript out of range");
#endif // _CONTAINER_DEBUG_LEVEL > 0
return _My_data._Myfirst[_Pos];
}
我有点困惑为什么会这样。我知道我正在尝试越界访问某些东西,或者做一些非法的事情,但是 Matrix[] 应该 return 一个向量,我应该能够再次使用 [] 来访问元素 T(在这个case int),我们将不胜感激。
编辑:
我就是这样使用 class
int main()
{
Matrix<int> a(10, 10);
a[0][0] = 10;
std::cout << a[0][0];
return 0;
}
您需要在构造函数中调整矩阵的大小以匹配作为参数传递的大小。
Matrix(int x, int y) : matrix(x)
{
for( auto& sub : matrix ) {
sub.resize(y);
}
DimensionHorizontal = x;
DimensionVertical = y;
}