错误:'infinity'不是一种类型。

3

我有一个程序包含许多cpp文件,我尝试创建一个makefile,但是当我运行它时,我得到了一些与此函数相关的错误:

void replace_infinites(cv::Mat_<int>& matrix) {
const unsigned int rows = matrix.rows,columns = matrix.cols;
//  assert( rows > 0 && columns > 0 );
if(rows==0 || columns==0)
    return;
double max = matrix(0, 0);
const auto infinity = std::numeric_limits<int>::infinity();

// Find the greatest value in the matrix that isn't infinity.
for ( unsigned int row = 0 ; row < rows ; row++ ) {
    for ( unsigned int col = 0 ; col < columns ; col++ ) {
        if ( matrix(row, col) != infinity ) {
            if ( max == infinity ) {
                max = matrix(row, col);
            } else {
                max = std::max<int>(max, matrix(row, col));
            }
        }
    }
}

// a value higher than the maximum value present in the matrix.
if ( max == infinity ) {
    // This case only occurs when all values are infinite.
    max = 0;
} else {
    max++;
}

for ( unsigned int row = 0 ; row < rows ; row++ ) {
    for ( unsigned int col = 0 ; col < columns ; col++ ) {
        if ( matrix(row, col) == infinity ) {
            matrix(row, col) = max;
        }
    }
}

我尝试包含:

#include <limits> 

using namespace std;

但是当我编译我的程序时,出现了以下错误:
munkres.cpp: In function ‘void replace_infinites(cv::Mat_<int>&)’:
munkres.cpp:44:16: error: ‘infinity’ does not name a type
munkres.cpp:49:38: error: ‘infinity’ was not declared in this scope
munkres.cpp:60:17: error: ‘infinity’ was not declared in this scope
munkres.cpp:69:38: error: ‘infinity’ was not declared in this scope

我在网上进行了很多研究,但没有找到解决我的问题的方法。

3
std::numeric_limits<int>::infinity 没有用,因为整数没有无穷大的概念。建议使用max代替。 - Baum mit Augen
编译器抱怨的实际代码行是哪一行?第44行对我们没有用。 - callyalater
2
如果您发布一个 [mcve] 或者至少告诉我们在示例中哪一行出现了错误,那就更好了。可能是一些与 using namespace std; 相关的无聊问题,例如编译器在您尝试使用变量 max 时捕捉到 std::max,或者其他类似的情况。专业提示:忘掉 using namespace std;,它带来的危害大于好处。 - Baum mit Augen
1
那么你的安装可能有问题,或者你的代码与描述不符。假设#include <limits>出现在同一源文件中,并且在你的有问题的代码之前,我使用gcc没有遇到任何问题。简而言之:无法重现错误。 - Peter
1
我第一条评论只是指出了一个与此无关的错误,并不打算给出答案。不管怎样,你展示的代码看起来没问题,请发布一个最小可复现的示例(MCVE)。 - Baum mit Augen
显示剩余4条评论
1个回答

2
似乎你没有使用C++11或更高版本进行编译,因为你的编译器在以下行上报错:
const auto infinity = std::numeric_limits<int>::infinity();

假设您确实包含了#include <limits>,那么该行代码没有任何问题,除了使用了auto。在没有C++11的情况下,编译器不知道auto是什么。请使用C++11或更高版本进行编译,或将auto更改为int
不相关的是,评论中指出,使用numeric_limits<int>::infinity来检查事物是一种可怕的方式。在无限大方面,用int进行比较没有任何意义。最好使用numeric_limits<int>::max(或其他适合您目的的内容)。

1
顺便说一句,“使用无穷大来检查事物”可能有点轻描淡写了,这完全是胡说八道(对于整数而言,对于浮点数则是可行的)。也许值得改变一下,以避免混淆初学者或懒得阅读你链接的人。 - Baum mit Augen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接