我正在为我的课做一个项目,教师给了我们一些代码片段,我们被要求修改它。代码在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) {};
};
你能告诉我这个问题是什么吗?
答案 0 :(得分:3)
您的声明违反了以下规则
3.3.7班级范围[basic.scope.class]
1以下规则描述了在类中声明的名称范围。
...
2)a中使用的名称N. S类在其背景下及何时引用相同的声明 在完成的S范围内重新评估。无需诊断 违反此规则。
在向量声明时,名称from d in Skills
where (d.SkillID == 5 || d.SkillID == 6 || d.SkillID == 7) // or is not supported
select new
{
Description = d.Description,
Employees = EmployeeSkills
.Where(es => es.SkillID == d.SkillID)
.Select(es => new
{
Level = es.Level,
YearsExperience = es.YearsOfExperience,
Emp = Employees.Single(emp => emp.EmployeeID == es.EmployeeID)
})
.Select(es => new
{
Level = es.Level,
YearsExperience = es.YearsExperience,
Name = es.Emp.FirstName + " " + es.Emp.LastName))
})
}
指的是类型rv
。但是,当在完整类struct rv
的范围内重新评估时,它指的是类成员rvs
。这种不一致是C ++中的一个错误。
标准
中的示例说明了类似的错误rvs::rv
正如@Ben Voigt在评论中所述,如果您明确解决enum { i = 1 };
class X {
char v[i]; // error: i refers to ::i
// but when reevaluated is X::i
...
enum { i = 2 };
};
与rv
和struct rv
之间的冲突为rv
,则错误将消失。您可以使用精心设计的类型说明符rvs::rv
或明确指定范围struct rv
来完成。
请注意,这是编译器无法保证/需要捕获的错误之一。
答案 1 :(得分:0)
您有一个名为rv
的类型和一个名为rv
的成员变量。在编写rv
时,编译器应该如何知道你的意思?
严格来说这是无效的代码,但Visual Studio似乎愿意让你自己开枪。