繁体   English   中英

在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]

1以下规则描述了在类中声明的名称的范围。

...

2)在S类中使用的名称N在其上下文中以及在S的完整范围中进行重新评估时应引用相同的声明。对于此规则的违反,无需进行诊断。

在向量声明中,名称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似乎愿意尝试让您自己射击。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM