我无法理解c ++中的结构声明

I can't understand the structure declaration in c++

本文关键字:结构 声明      更新时间:2023-10-16

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

但是,这并不意味着我们不能使用struct前缀。我们仍然可以使用struct前缀。例如,c++的创建者Bjarne Stroustrup介绍了一个声明带有和不带有struct前缀的结构的例子,这让我感到困惑。

以下是结构定义,它们试图用模板参数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;
};

现在,下面是函数声明,它们的返回类型和参数类型是结构。尽管这些与上面的没有太大区别,但下面两个函数声明中的第一个,即带有结构前缀的声明,在Visual Studio c++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);

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

除了在C中,在C++中,如果没有歧义,则可以省略struct(和class)关键字如果有歧义,您仍然需要使用struct关键字。一个臭名昭著的例子是POSIX的stat:有一个struct stat和一个函数stat。在这里,您总是必须使用struct stat来引用类型。

当你自己解释时,你似乎理解得很好。在C++中,关键字结构与关键字类相同,但默认为public成员,而不是private成员。因此,在使用struct关键字声明了一个类之后,在引用该类时就不会再使用它了。您似乎在尝试使用struct,就像第一个例子中C中使用的那样。这与C++不同。