【问题标题】:I can't understand the structure declaration in c++我无法理解 C++ 中的结构声明
【发布时间】:2013-08-05 19:18:53
【问题描述】:

在 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++ 中可以省略 struct 关键字? Why does C need “struct” keyword and not C++?
  • 你用的是什么编译器?并非所有 C++ 都符合标准。
  • @Blastfurnace 谢谢。但是,我还有一个问题。你给我的链接说如果没有歧义,c ++“允许”省略 struct 关键字。这意味着我们仍然可以使用 struct 关键字。然后我的第二个代码中存在歧义,因为它给了我一个错误。但是,我没有看到任何模棱两可的地方。怎么了?
  • @Anycorn 我正在使用 Visual Studio C++ 2012。
  • 使用 g++,两行都可以编译。

标签: c++ c class struct structure


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    当你自己解释时,你似乎理解得很好。在 C++ 中,关键字 struct 与关键字 class 相同,但默认为 public 而不是 private 成员。 因此,使用 struct 关键字声明了一个类后,您在引用该类时不会再次使用它。您似乎正在尝试使用 struct ,因为它将在第一个示例中在 C 中使用。这对于 C++ 来说是不同的。

    【讨论】:

    • 所以,你基本上总结了他的问题。
    • 但是,即使在结构定义之后,我们也有可能使用结构前缀。我们可以在我的第一个代码中看到这一点。太复杂了。 :-(
    • 这并不复杂,只是 C++ 是与 C 不同的语言。关键字 struct 意味着不同的东西。 Objective-C 是 C 的扩展,因此所有 C 仍然有效,但 Stroustrup 决定在设计 C++ 时不保持这种向下兼容性。
    • @DavidElliman:我刚刚重读了一遍,并意识到虽然你是 100% 正确的,但向后兼容性并不能解释这个问题的任何内容。 C++可以编译大部分C代码,Objective-C可以编译所有C代码。所有三个编译struct linked_list&lt;T&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    相关资源
    最近更新 更多