前向声明时“struct”和“class”关键字是不是相同? [复制]
Posted
技术标签:
【中文标题】前向声明时“struct”和“class”关键字是不是相同? [复制]【英文标题】:Are "struct" and "class" keywords the same when forward declaring? [duplicate]前向声明时“struct”和“class”关键字是否相同? [复制] 【发布时间】:2020-05-13 15:42:31 【问题描述】:在过去,我能够将类声明为结构体,反之亦然,或者像在 C 中声明类型,比如:
void function(struct Foo* arg);
void function(class Foo* arg);
我认为出于此目的或前向声明的目的它们是相同的,因为我多次听说结构和类之间的唯一区别是默认访问说明符(结构是公共默认值,而类是私有的)。
我已经将我的一个类中的一个单词从“struct”更改为“class”,这是我第一次看到它破坏了我的代码,链接器说它找不到那个变量在某处定义的类型。这样就不能把“struct”和“class”混在一起了吧?
【问题讨论】:
【参考方案1】:你有时会侥幸逃脱。而你通常不会。
结构、类和命名空间不相同。您绝对确实需要在前向声明时使用正确的关键字。
让我很烦恼,因为没有合法的方式来转发声明嵌套类或结构。
【讨论】:
OP没有询问命名空间,结构/类是一样的。 Visual Studio 可能不这么认为,但 C++ 标准却这么认为。而前向声明嵌套类型与struct
或class
是否相同无关。
@NicolBolas 一些程序员似乎认为,因为他们的编译器没有将类、结构和命名空间标记为不同的类型,所以允许他们将嵌套类转发声明为命名空间中的类。他们错了,但他们认为“编译器允许它一定没问题!”
@NicolBolas 即使标准声称它们是等效的,至少有一个编译器不同意,并且在我看来,在前向声明中使用错误的关键字是 只是马虎 .
"一些程序员似乎认为,因为他们的编译器没有将类、结构和命名空间标记为不同的类型,所以允许他们将嵌套类转发声明为命名空间中的类.”没有程序员这么想。并且没有编译器允许您将嵌套类转发声明为命名空间中的类。再说一遍,OP 没有提到命名空间,所以我不知道你为什么要提出它们。
"即使标准声称它们是等效的,至少有一个编译器不同意" ...那又如何?这并不能使他们正确。你可以不同意偷东西是否可以,但这不会成为审判中的有效辩护。以上是关于前向声明时“struct”和“class”关键字是不是相同? [复制]的主要内容,如果未能解决你的问题,请参考以下文章