问题:编译器声明一个看似荒谬的错误,即类成员函数"中的局部变量未在此范围内声明"。下面显示的代码是原始函数的简化实现,并且它仍以某种方式触发相同的错误。此外,每当我重命名变量(在每个地方使用它)时,错误就会消失,并在我将变量更改回其原始名称后立即恢复("次要")。我不了解这种行为,无法找到有关导致编译器执行此操作的任何信息/帖子。有人可以提出可能出错的建议吗?它是否表示我的代码中的其他地方存在重大错误(例如Matrix类定义)?
详细信息:我正在使用CMake生成的Makefile上的g ++编译Linux Mint 18。我已尝试使用和不使用各种编译器选项(例如-O2,-Wall等),结果不变。我之前使用MinGW和自编写的Makefile在Windows 7上编译并运行了稍早版本的代码/项目,没有任何问题。我很乐意根据您的要求提供更多详细信息。
来自Matrix.cpp的修改/极简主义代码段:
Matrix Matrix::BuildCofactorMatrix() const {
double minor (0.0);
minor = 1.0;
return Matrix(height_, width_);
}
警告讯息
/ PATH-TO-PROJECT-ROOT /src/Matrix.cpp:在成员函数'Matrix Matrix :: BuildCofactorMatrix()const'中: /PATH-TO-PROJECT-ROOT/src/Matrix.cpp:1123:5:错误:未在此范围内声明'minor' minor = 1.0;
2017-08-21编辑: 我删除了不必要的代码并创建了一个真正的"最小,完整,可验证的"问题的例子。对我来说,错误似乎是iostream库的一个功能。如果我删除iostream包含,问题似乎消失了。但是,错误还取决于用于编译的c ++标准。当我指定g ++使用时,例如-std = c ++ 11或-std = c ++ 14时,问题仍然存在,但是一旦我删除了规范(即g ++ -c Matrix.cpp),错误就会消失。顺便说一句,我使用的是g ++ 4:5.3.1-1ubu。
除非我遗漏了某些内容,否则我无法在iostream,istream,ostream或ios中找到任何提及术语" minor"的宏,但也许它可能是进一步扩大包含链......?
Matrix.hpp:
#ifndef MATRIX_HPP
#define MATRIX_HPP
class Matrix {
public:
void BuildCofactorMatrix() const;
};
#endif
Matrix.cpp:
#include "Matrix.hpp"
#include <iostream>
void Matrix::BuildCofactorMatrix() const {
double minor (0.0);
minor = 0.0;
}
答案 0 :(得分:2)
我可以通过在函数之前添加#define minor(x) (x)
来复制问题。
如果不使用&#34;参数&#34;宏匹配minor(0.0)
但不匹配minor
。
该行
double minor (0.0);
将被
取代double (0.0);
这是一个有效但无用的类型转换。
因此,请在其中一个包含文件中查找一些邪恶的宏。