[英]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 rv
和rv
解析为rvs::rv
之间的冲突,则错误将消失。 您可以通过使用精心设计的类型说明符struct rv
或通过显式指定作用域::rv
。
请注意,这是不能保证/要求编译器捕获的那些错误之一。
你有一种称为rv
,并呼吁成员变量rv
。 编写rv
时,编译器应如何知道您的意思?
严格来说,这是无效的代码,但是Visual Studio似乎愿意尝试让您自己射击。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.