在gcc中编译时出错

时间:2015-10-21 19:21:51

标签: c++ visual-studio-2012 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) {};
};

你能告诉我这个问题是什么吗?

2 个答案:

答案 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 }; }; rvstruct rv之间的冲突为rv,则错误将消失。您可以使用精心设计的类型说明符rvs::rv或明确指定范围struct rv来完成。

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

答案 1 :(得分:0)

您有一个名为rv的类型和一个名为rv的成员变量。在编写rv时,编译器应该如何知道你的意思?

严格来说这是无效的代码,但Visual Studio似乎愿意让你自己开枪。