C++ Visual Studio允许不相关的类方法访问嵌套的私有类?

C++ Visual Studio允许不相关的类方法访问嵌套的私有类?,c++,visual-c++,gcc,C++,Visual C++,Gcc,我正在尝试在linux和windows上构建我的项目。该项目已经在windows上运行,但我在GCC上遇到了一个非常奇怪的错误。考虑下面的代码: Class Base { private: MessageInfo *createMsg(); } Class MessageInfo { private: class Message{ ... } public: Message *messages[MAX_NO_MESS

我正在尝试在linux和windows上构建我的项目。该项目已经在windows上运行,但我在GCC上遇到了一个非常奇怪的错误。考虑下面的代码:

Class Base {
 private:
        MessageInfo *createMsg();
}

Class MessageInfo {
private:
       class Message{
         ...
       }
public:
    Message    *messages[MAX_NO_MESSAGES];
...
}

MessageInfo *Base::createMsg(){
...
       MessageInfo *newMsg = new MessageInfo;
       newMsg->messages[i] = new MessageInfo::Message();
...
}
现在的问题是,在Visual Studio中,每件事都会编译,但在GCC中,我会遇到以下错误:

*错误:Class MessageInfo::Message是私有的

我真的很惊讶代码实际上是在VisualStudio中编译的,而不是在GCC中编译的。有什么建议吗

编辑:


我想我必须以更好的方式问我的问题。我的问题是,如何在VS2005中编译这样的代码???我在VS2013中尝试了我的代码,它给出了与GCC相同的错误。所以我并不是说代码是正确的

编译器是如此的不同,我不确定为什么VS会允许编译,我使用的任何编译器都会抛出编译错误。 你现在做的是一个不好的课堂思考方式。如果你有

class Message {...};

在MessageInfo中为private,那么您应该不能在类之外的任何地方访问它。我们只希望消息在MessageInfo类中可用,而不在其他任何地方。因此,您不应该像在MessageInfo中那样返回消息*,也不能像在main中那样访问Message()构造函数。不允许以这种方式编程,因为否则将完全违背封装的目的。如果您确实希望消息对任何人都可用,那么就将其公开,但通常情况下,类的内部工作是隐藏的,用户不必担心这一点

这不会在Visual Studio 2013中编译:

class MessageInfo {
    class Message { };

public:
    Message *messages[256];    
};

class Base {
    MessageInfo *createMsg();
};

MessageInfo *Base::createMsg() {
    MessageInfo *newMsg = new MessageInfo;
    newMsg->messages[0] = new MessageInfo::Message(); // won't compile
}

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}
正如您所料,错误是:


错误C2248:'MessageInfo::Message':无法访问egrunin建议的类'MessageInfo'中声明的私有类。

,我使用了他在评论中建议的代码。显然,您无法在Visual Studio 2013中编译该代码,但我使用Visual Studio 2005在我的机器上成功编译了它。下面是完整的代码 使用:

我做错什么了吗

附言:


我在Visual Studio 2010上尝试了该代码,得到了类“MessageInfo”中声明的无法访问私有类的错误!!有谁能在Visual Studio 2005上编译这段代码,让我知道VS 2005有什么问题吗???

我99%肯定GCC是正确的,Visual Studio是错误的,但我不能引用标准语言来说明这一点,我也不知道Visual Studio为什么会出错-这是一个非常复杂的问题,语言的基本方面。你应该发布一个MCVE。你能告诉我们你使用的是哪个版本的Visual Studio吗?最新版本比旧版本更符合C++标准。Visual Studio的哪个版本?VS 2015产生与GCC相同的错误:
错误C2248:'MessageInfo::Message':无法访问类'MessageInfo'中声明的私有类。
。VS 2013也会产生同样的错误。VS 2012-同样的错误。您使用的是过时的东西吗?这甚至不会远程重现您的问题,因此在您提供可编译的示例之前,这个问题无法回答。我使用的是Visual Studio 2005,我编译的代码与您的代码完全相同。你认为这是编译器版本的问题吗???是的,我肯定是这样。
 // Test.cpp : Defines the entry point for the console application.
 //
#include "stdafx.h"

class MessageInfo {
    class Message { };

public:
    Message *messages[256];    
 };

class Base {
    MessageInfo *createMsg();
};

MessageInfo *Base::createMsg() {
    MessageInfo *newMsg = new MessageInfo;
    newMsg->messages[0] = new MessageInfo::Message(); // won't compile
    return newMsg;
 }

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}