C++ 在gcc中编译时出错

C++ 在gcc中编译时出错,c++,visual-studio-2012,gcc,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’ [-fpermiss

我正在为我的班级做一个项目,老师给了我们一些代码片段,我们被要求修改它。代码在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)) ===|
||===构建:在项目中调试(编译器:GNU GCC编译器)===|
/home/nitin/Read.h | 45 |错误:声明'std::vector rvs::rv'[-fppermissive]|
/home/nitin/Read.h | 35 |错误:将“rv”的含义从“struct rv”[-fppermissive]更改|
||==生成失败:2个错误,0个警告(0分钟,0秒))===|
错误中的代码是以下代码的代码段:

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) {};
};
struct rv
{
双val,prob;
rv(常数双v,常数双p):val(v),prob(p){};
};
结构rvs
{
int row\n,col\n;
向量rv;
rvs(constintr=-2,constintc=-2):行n(r),列n(c){};
};

您能告诉我问题出在哪里吗?

您有一个名为
rv
的类型和一个名为
rv
的成员变量。编写
rv
时,编译器如何知道您指的是哪一个


严格来说,这是无效的代码,但Visual Studio似乎愿意尝试让您射中自己的脚。

您有一个名为
rv
的类型和一个名为
rv
的成员变量。编写
rv
时,编译器如何知道您指的是哪一个


严格来说,这是无效的代码,但Visual Studio似乎愿意尝试让您射中自己的脚。

您有一个名为
rv
的类型和一个名为
rv
的成员变量。编写
rv
时,编译器如何知道您指的是哪一个


严格来说,这是无效的代码,但Visual Studio似乎愿意尝试让您射中自己的脚。

您有一个名为
rv
的类型和一个名为
rv
的成员变量。编写
rv
时,编译器如何知道您指的是哪一个


严格来说,这是无效的代码,但Visual Studio似乎愿意让您自食其果。

您的声明违反了以下规则

3.3.7类别范围[基本范围类别]

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

2) 在一个句子中使用的名字 S类应在其上下文中以及在下列情况下引用同一声明: 在已完成的S范围内重新评估。无需诊断 因为违反了这条规则

在向量声明点处,name
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
As
struct rv
rv
As
rvs::rv
之间的冲突,错误就会消失。可以通过使用复杂的类型说明符
struct rv
或通过显式指定作用域
::rv
来实现


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

您的声明违反了以下规则

3.3.7类别范围[基本范围类别]

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

2) 在一个句子中使用的名字 S类应在其上下文中以及在下列情况下引用同一声明: 在已完成的S范围内重新评估。无需诊断 因为违反了这条规则

在向量声明点处,name
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
As
struct rv
rv
As
rvs::rv
之间的冲突,错误就会消失。可以通过使用复杂的类型说明符
struct rv
或通过显式指定作用域
::rv
来实现


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

您的声明违反了以下规则

3.3.7类别范围[基本范围类别]

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

2) 在一个句子中使用的名字 S类应在其上下文中以及在下列情况下引用同一声明: 在已完成的S范围内重新评估。无需诊断 因为违反了这条规则

在向量声明点处,name
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
As
struct rv
rv
As
rvs::rv
之间的冲突,错误就会消失。可以通过使用复杂的类型说明符
struct rv
或通过显式指定作用域
::rv
来实现


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

您的声明违反了以下规则

3.3.7类别范围[基本范围类别]

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

2) 在一个句子中使用的名字 S类应参考本规范中的相同声明