在gcc中编译时出错
Error while compiling in gcc
我正在为我的班级做一个项目,导师给了我们一些代码片段,我们被要求修改它。代码在Visual Studio中的类计算机中正确编译,但当我尝试用gcc编译它时,它给了我一个错误。我得到的错误是:
||=== Build: Debug in Project (compiler: GNU GCC Compiler) ===|
/home/nitin/Read.h|45|error: declaration of ‘std::vector<rv> rvs::rv’ [-fpermissive]|
/home/nitin/Read.h|35|error: changes meaning of ‘rv’ from ‘struct rv’ [-fpermissive]|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
这个错误的代码片段是:
struct rv
{
double val, prob;
rv(const double v, const double p): val(v), prob(p) {};
};
struct rvs
{
int row_n, col_n;
vector<rv> rv;
rvs(const int r=-2, const int c=-2): row_n(r), col_n(c) {};
};
你能告诉我可能是什么问题吗?
你的声明违反了以下规则
3.3.7类作用域[basic.scope.class]
下面的规则描述了类中声明的名称的作用域:…
2) A中使用的名称N第S类应在其上下文和时间内引用相同的声明在完整的s范围内重新评估,无需诊断
在vector声明名称处,rv
表示类型struct rv
。但在完整类rvs
范围内重新评价时,指的是类成员rvs::rv
。这种不一致在c++中是错误的。
标准
中的一个例子说明了类似的错误。enum { i = 1 };
class X {
char v[i]; // error: i refers to ::i
// but when reevaluated is X::i
...
enum { i = 2 };
};
正如@Ben Voigt在评论中所说,如果你明确地解决rv
作为struct rv
和rv
作为rvs::rv
之间的冲突,错误就会消失。您可以通过使用详细的类型说明符struct rv
或通过显式指定范围::rv
来做到这一点。
请注意,这是不保证/不要求编译器捕获的错误之一。
类型为rv
,成员变量为rv
。当你写rv
时,编译器怎么知道你指的是哪个?
严格来说这是无效的代码,但是Visual Studio似乎愿意尝试让你搬起石头砸自己的脚。
相关文章:
- 在Linux for Windows上编译C++代码时出错
- 为x86而非x64编译时出错
- 当我尝试通过 mingw 使用 CMake 和 SFML 库编译项目时出错
- 尝试在Windows上执行C++时出错(通过MinGW编译)
- 如何使用我构建的库,而不会从源代码出错,但不为我自己的项目编译?
- constexpr 使用 clang 编译 TensorFlow 时出错
- 从DLL导出函数,LoadLibrary()需要用TEXT转换的字符串才能编译而不会出错
- 编译包含指向模板函数的指针的初始值设定项列表时,gcc 出错,但 clang 不出错
- 编译时出错 - 从 DWORD 到 LPCVOID 的转换
- 在发布模式下启动使用库的静态链接编译的应用程序时出错
- 编译时出错 - 链接.cpp和头文件
- <limits> 使用 VSC2019 编译旧代码时出错
- 在 ubuntu 焦点上编译虚幻引擎 4.25 时出错
- 编译包含LLVM API标头的C++文件时出错
- 编译以下代码时出错
- 使用交叉工具ng编译gcc时出错
- 在 dll 中为 qLibrary 编译 qobject 时出错
- 使用 cmake 在窗口上编译 c++ 数据库时出错
- 使用 TDM GCC 5.1.0 编译 PDCurses36 时出错
- Lua :在原生lua中编译,但在使用LuaJIT和sol2时C++出错