c++ - C++ Exception is Caught Late, 什么可能导致这个?
问题描述
我有以下代码main.cpp
:
#include <iostream>
#include "Matrix.h"
int main(){
mtm::Dimensions dim_1(2,3);
try{
const mtm::Matrix<int> mat_1 = mtm::Matrix<int>::Diagonal(2,1);
mtm::Matrix<int> mat_2 = mtm::Matrix<int>::Diagonal(2,-1);
std::cout<<(-mat_2)(1,1)<<(-mat_2)(2,2)<<std::endl;
} catch(mtm::Matrix<int>::AccessIllegalElement& e){
std::cout<<e.what()<<std::endl;
}
}
虽然它应该给我以下输出:
Mtm matrix error: An attempt to access an illegal element
它返回以下内容:(注意开头的 1)
1Mtm matrix error: An attempt to access an illegal element
这是我在以下方面的实施operator<<
方式Matrix.h
:
template<typename T>
std::ostream &operator<<(std::ostream &os, const Matrix<T> &matrix) {
typename Matrix<T>::const_iterator it_begin = matrix.begin();
typename Matrix<T>::const_iterator it_end = matrix.end();
return printMatrix(os, it_begin, it_end, matrix.width());
}
而 printMatrix() 代码是:
template<class ITERATOR_T>
std::ostream& printMatrix(std::ostream& os,ITERATOR_T begin,
ITERATOR_T end, unsigned int width){
unsigned int row_counter=0;
for (ITERATOR_T it= begin; it !=end; ++it) {
if(row_counter==width){
row_counter=0;
os<< std::endl;
}
os <<*it<<" ";
row_counter++;
}
os<< std::endl;
return os;
}
什么可能导致此错误,我该如何解决?
如果有任何遗漏,请告诉我。
解决方案
该语句std::cout << (-mat_2)(1,1) << (-mat_2)(2,2) << std::endl;
只不过是编写函数调用链的一种简写方式。
在 C++17 之前,未指定语句中单独函数的参数的求值顺序。
因此,在某些平台上(-mat_2)(1,1)
可能会引发异常,而在其他平台上可能会引发异常(-mat_2)(2,2)
。
std::cout
如果您想更严格地控制行为,C++17 之前的一种解决方案是将它们分解为单独的语句。
从 C++17 开始,指定了顺序,并且必须从(-mat_2)(1,1)
.
推荐阅读
- arduino - 如何检测功能键的 KeyCode 事件?
- java - 在android中实现strip时出现异常没有这样的payment_intent
- python - 管理自动化数据处理系统?关于这个主题,我应该研究的研究领域/关键字是否有名称?
- python - 如何从 PIL 模块 python 中修复此错误“fromarray”函数?
- java - 在Java中将布尔数据类型转换为位
- node.js - 尝试为我的 getAll 表行列表构建搜索功能
- c# - 不能在单元测试中使用模拟的接口类
- json - 如何将 json 响应对象的特定数据类型存储在数组中(例如:数字)以将数据源作为变量传递
- r - 数据框错误:参数暗示不同的行数但它们是相同的?
- asp.net - 在多对多关系中添加实体时所有值都设置为 null