C++ 是";结构";及;“类”;关键词转发时是否相同?

C++ 是";结构";及;“类”;关键词转发时是否相同?,c++,class,forward-declaration,C++,Class,Forward Declaration,在过去,我可以将类前向声明为结构,反之亦然,或者像在C中那样声明类型,比如: void function(struct Foo* arg); void function(class Foo* arg); 我认为它们在这个或转发声明中是一样的,因为我多次听说结构和类之间的唯一区别是默认访问说明符(结构是公共默认的,而类是私有的) 我把我的一个类中的一个词从“struct”改为“class”,这是我第一次看到它破坏了我的代码,链接器说它找不到在某处定义的那种类型的变量。这不允许以这种方式混合“st

在过去,我可以将类前向声明为结构,反之亦然,或者像在C中那样声明类型,比如:

void function(struct Foo* arg);
void function(class Foo* arg);
我认为它们在这个或转发声明中是一样的,因为我多次听说结构和类之间的唯一区别是默认访问说明符(结构是公共默认的,而类是私有的)


我把我的一个类中的一个词从“struct”改为“class”,这是我第一次看到它破坏了我的代码,链接器说它找不到在某处定义的那种类型的变量。这不允许以这种方式混合“struct”和“class”吗?

您有时会侥幸逃脱。通常你不会

结构、类和命名空间不相同。转发声明时,您绝对需要使用正确的关键字


这让我很恼火,因为没有合法的方法来正向声明嵌套的类或结构。

OP没有询问名称空间,而struct/class是相同的。VisualStudio可能不这么认为,但是C++标准确实如此。向前声明嵌套类型与
struct
class
是否相同无关。@NicolBolas一些程序员似乎认为,因为他们的编译器没有将类、结构和命名空间标记为不同的类型,所以允许他们将嵌套类向前声明为命名空间中的类。他们错了,但他们认为“编译器允许它,它必须是好的!”@Nicolas,即使标准声称它们是等效的,但至少有一个编译器不同意,在我看来,在转发声明中使用错误的关键字在任何情况下都是草率的。“一些程序员似乎认为,因为他们的编译器没有将类、结构和命名空间标记为不同的类型,所以允许他们将嵌套类作为命名空间中的类进行前向声明。“没有程序员这么认为。并且没有编译器允许您将嵌套类作为命名空间中的类进行前向声明。同样,OP没有提到名称空间,所以我不知道你为什么会提到它们。“而且即使标准声称它们是等效的,至少有一个编译器不同意”。。。那又怎么样?这并不意味着他们是对的。你可以对偷东西是否可以持不同意见,但这不会成为审判时的有效辩护。