C++ 我能';不理解c+中的结构声明+;

C++ 我能';不理解c+中的结构声明+;,c++,c,class,struct,structure,C++,C,Class,Struct,Structure,在C语言中,每当我们想要声明或定义一个结构时,都必须使用结构前缀。然而,一旦结构成为C++中的一类,情况就发生了变化。在声明结构时,我们不再需要使用struct前缀。在这种情况下,我猜C中的结构标记变成了C++中的一个类型名称 然而,这并不意味着我们不能使用struct前缀。我们仍然可以使用struct前缀。例如,C++的创建者Bjarne Stroustrup介绍了一个声明结构的例子,它既有,也没有结构> 前缀,这使我感到困惑。 下面是一些结构定义,它们试图用模板参数T生成一个结构。这些定义编

在C语言中,每当我们想要声明或定义一个结构时,都必须使用结构前缀。然而,一旦结构成为C++中的一类,情况就发生了变化。在声明结构时,我们不再需要使用
struct
前缀。在这种情况下,我猜
C
中的结构标记变成了
C++
中的一个类型名称

然而,这并不意味着我们不能使用
struct
前缀。我们仍然可以使用
struct
前缀。例如,C++的创建者Bjarne Stroustrup介绍了一个声明结构的例子,它既有,也没有<代码>结构> <代码>前缀,这使我感到困惑。 下面是一些结构定义,它们试图用模板参数T生成一个结构。这些定义编译得很好,没有错误

template<class T> struct linked_list {
    T element;
    linked_list<T> *next;
};
template<class T> struct linked_list {
    T element;
    struct linked_list<T> *next;
};
模板结构链接列表{
T元素;
链接列表*下一步;
};
模板结构链接列表{
T元素;
结构链接列表*下一步;
};
下面是返回类型和参数类型为结构的函数声明。尽管这些与上面的不同,但第一个从下面两个函数声明,一个带有结构前缀的函数,给了我一个VisualStudioC++ 2012

的错误。
template<class T> struct linked_list<T> *add_list(T element, struct linked_list<T> *tail);
template<class T> linked_list<T> *add_list(T element, linked_list<T> *tail);
模板结构链表*添加链表(T元素,结构链表*尾部);
模板链表*添加链表(T元素,链表*尾部);

我真的不明白事情是怎么回事。我不理解这些声明之间的区别。有谁能给我一个详细的解释吗?

你自己解释的时候,似乎确实理解得很好。在C++中,关键字结构与关键字类相同,但默认为公共的而不是私有的成员。
因此,在使用struct关键字声明了一个类之后,在引用该类时不再使用它。您似乎在尝试使用struct,就像第一个示例中在C中使用它一样。对于C++,这只是不同的。

< P>除了C++之外,在C++中,如果没有安全性,则可以省略<代码>结构> <代码>(和<代码>类<代码> >关键字。如果存在歧义,您仍然必须使用
struct
关键字。一个臭名昭著的例子是POSIX'
stat
:有一个
struct stat
和一个函数
stat
。在这里,您必须始终使用
struct stat
来引用类型。

因此,您基本上总结了他的问题。但是,即使在定义结构之后,我们也可能使用struct前缀。我们可以在我的第一个代码中看到这一点。太复杂了-(其实,C++并不是一种不同的语言,C结构是不同的语言。ObjaveC是C的扩展,所以C都是有效的,但是Stroustrup决定在设计C++时不保持这样的向下兼容性。”DavidElliman:我重读一下,意识到尽管你是100%正确的,后面的可兼容性没有解释任何问题。C++可以编译大多数C代码,Objto-C可以编译所有的C代码。三个编译的代码>结构Link KEDLISTRONG/<代码>。你问为什么C++中省去了<代码>结构> /COD>关键字?你使用的是什么编译器?不是所有的C++都符合标准。@但是,我仍然有一个问题。你给我的链接说如果没有歧义,C++允许“省去结构关键字”。这意味着我们仍然可以使用Strut关键字。然后,我的第二个代码中有一个歧义,因为它给了我一个错误。但是,我看不出有什么歧义。怎么了?使用VisualStudioC++ 2012。用G++,两行都编译。