C++ 在gcc中编译时出错
我正在为我的班级做一个项目,老师给了我们一些代码片段,我们被要求修改它。代码在Visual Studio中的我的类计算机中正确编译,但当我尝试使用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
||=== 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
Asstruct rv
和rv
Asrvs::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
Asstruct rv
和rv
Asrvs::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
Asstruct rv
和rv
Asrvs::rv
之间的冲突,错误就会消失。可以通过使用复杂的类型说明符struct rv
或通过显式指定作用域::rv
来实现
请注意,这是编译器不保证/不要求捕获的错误之一。您的声明违反了以下规则 3.3.7类别范围[基本范围类别] 1以下规则描述了类中声明的名称的范围 2) 在一个句子中使用的名字 S类应参考本规范中的相同声明