首页 > 解决方案 > 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;
}

什么可能导致此错误,我该如何解决?

如果有任何遗漏,请告诉我。

标签: c++classgenericsexceptionoperator-overloading

解决方案


该语句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).


推荐阅读