在gcc中编译时出错

Error while compiling in gcc

本文关键字:出错 编译 gcc      更新时间:2023-10-16

我正在为我的班级做一个项目,导师给了我们一些代码片段,我们被要求修改它。代码在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 rvrv作为rvs::rv之间的冲突,错误就会消失。您可以通过使用详细的类型说明符struct rv或通过显式指定范围::rv来做到这一点。

请注意,这是不保证/不要求编译器捕获的错误之一。

类型为rv,成员变量为rv。当你写rv时,编译器怎么知道你指的是哪个?

严格来说这是无效的代码,但是Visual Studio似乎愿意尝试让你搬起石头砸自己的脚。