您好我必须将一些用c ++编写的东西从unix base os移植到windows visual studio 2008。 以下代码使用void ** - 指向数据的指针实现数组数据类型。
struct array
{
int id;
void **array; // store the actual data of the array
// more members
}
当我在Unix上用g ++编译时,没关系,但是当我尝试使用MSVS 2008时,我得到了错误 - 错误C2461:'array':构造函数语法缺少形式参数。当我将成员从'array'更改为其他工作时,所以编译器认为成员名称'array'实际上是struct数组的构造函数。将结构命名为结构,显然不是一个好习惯,但它已经是这样编写的。我可以告诉MSVS编译器忽略这个问题,或者我应该重命名与结构名称相同的所有成员。
答案 0 :(得分:5)
您正在处理GCC编译器中的错误。 C ++语言明确禁止拥有名称与类名相同的数据成员(见9.2 / 13)。 MS编译器抱怨它是正确的。此外,在这种情况下,需要任何C ++编译器来发出诊断消息。由于海湾合作委员会即使在“-ansi -pedantic-Wall”模式下仍然保持沉默,因此在海湾合作委员会中这是一个明显的错误。
Revison :我上面所说的只是在C ++语言的“经典”C ++ 98规范中才是正确的。在最新的规范中,此要求仅适用于该类的 static 数据成员。现在,非静态数据成员可以与该类共享名称。我不知道这个改变是否已经在修订标准的官方版本中。
这意味着两个编译器都以自己的方式正确。 MS编译器坚持使用该语言的“经典”C ++ 98规范,而GCC似乎实现了更新的规范。
答案 1 :(得分:3)
我会说,如果你做的事情你自己称之为“不是一个好习惯”,那么你应该改变它。
答案 2 :(得分:2)
我会将您的属性重命名为与该类名称不同。这将使您的代码更具可移植性。如果您将来必须转移到另一个编译器,那么您将不会再次遇到此问题。