未在此范围内声明变量gcc错误

variable was not declared in this scope gcc error

本文关键字:变量 gcc 错误 声明 范围内      更新时间:2023-10-16

我有以下模板函数

//This is a very naive implementation, but it will do
template<class T>
T determinant(const std::vector<std::vector<T>> &matrix)
{
    sci::assertThrow(square(matrix), sci::err());
    if (matrix.size() == 1)
        return matrix[0][0];
    else if (matrix.size() == 2)
        return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
    else
    {
        double result = 0;
        std::vector<std::vector<double>> minor(matrix.size() - 1);
        double multiplier = 1.0;
        for (size_t i = 0; i < matrix.size(); ++i)
        {
            for (size_t j = 0; j < minor.size(); ++j)
            {
                if (j < i)
                    minor[j] = matrix[j];
                else
                    minor[j] = matrix[j + 1];
            }
            result += multiplier * matrix[0][i] * sci::determinant(minor);
            multiplier *= -1.0;
        }
        return result;
    }
}

它与visualstudio 2015一起编译得很好,然而gcc表示

g++ -c -Wall -g -std=c++11 -fPIC -o3 -o build/svector.o svector/svector.cpp
In file included from svector/svector_internal.h:6:0,
                 from svector/svector.cpp:1:
svector/../include/svector/dep/svector.h: In function 'T sci::determinant(const std::vector<std::vector<T> >&)':
svector/../include/svector/dep/svector.h:2888:28: error: 'minor' was not declared in this scope
     for (size_t j = 0; j < minor.size(); ++j)
                            ^
svector/../include/svector/dep/svector.h:2895:60: error: 'minor' was not declared in this scope
     result += multiplier * matrix[0][i] * sci::determinant(minor);
                                                            ^

在我看来,在gcc抱怨的这一点上,minor肯定在范围内。有人能解释一下这个错误的原因吗?

Glibc中的sys/sysmacros.h包含宏定义:
# define major(dev) gnu_dev_major (dev)
# define minor(dev) gnu_dev_minor (dev)

这可能是通过您正在包含的某个系统标头包含的。

变量定义中minor后面的括号会引起宏调用,从而更改变量名。minor的其他用法没有括号,因此不会调用宏,这会导致minor引用一个不存在的变量。

您可以重命名minor变量或取消定义minor以修复错误。