2015-09-22 32 views
-3

我正試圖在linux和windows上構建我的項目。該項目已在Windows上工作,但我在GCC上遇到了一個非常奇怪的錯誤。請看下面的代碼:Visual Studio允許不相關的類方法訪問嵌套的私有類?

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我得到以下錯誤:

*錯誤:類MessageInfo :: Message是私人

我真的很驚訝,代碼實際上編譯在Visual Studio中,但不是在GCC中。有什麼建議麼???

編輯:

我想我要問我的問題以更好的方式。我的問題是如何甚至有可能在VS 2005中編譯這樣的代碼?我在VS2013中試過我的代碼,它給了我和GCC一樣的錯誤。所以我不認爲代碼是正確的!

+3

我很喜歡99%的GCC是正確的,Visual Studio是錯誤的,但我不能引用標準語言來達到這個效果,也不知道爲什麼Visual Studio會出錯 - 這是一個非常非常基本的方面的語言。 – zwol

+4

你應該發佈一個MCVE。 – juanchopanza

+0

您似乎在類MessageInfo中聲明瞭一個名爲private的類Message。我認爲GCC在這種情況下是正確的。 – Logicrat

回答

0

編譯器是如此不同,我不確定爲什麼VS會允許編譯,我用過的任何編譯器都會引發編譯錯誤。 你在做什麼雖然是一個糟糕的方式來思考一個類。如果您在MessageInfo中擁有私有的,那麼您應該無法在類之外的任何位置訪問該私鑰。我們只希望Message在MessageInfo類中可用,而在其他地方不可用。因此,您不應該像在MessageInfo中那樣返回Message *,而且您將無法像在main中那樣訪問Message()構造函數。這種編程方式是不允許的,否則它將完全違背封裝的目的。如果你確實希望任何人都可以看到消息,那麼就把它公開,但通常一個類的內部運作是遠離用戶隱藏的很好的理由:他們不需要擔心。

2

這並不編譯在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; 
} 

的錯誤,正如你所期望的,就是:

error C2248: 'MessageInfo::Message' : cannot access private class declared in class 'MessageInfo'

+0

我正在使用Visual Studio 2005,並編譯了精確的代碼你有。你認爲它的編譯器版本問題? – maskarih

+0

是的,我確定就是這樣。 – egrunin

0

正如egrunin建議我使用的代碼,他在評論中建議。顯然,你不能編譯的代碼在Visual Studio 2013,但我成功編譯它使用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; 
} 

我做一些事情錯在這裏???

P.S:

我試圖在Visual Studio 2010中的代碼,我得到了不能訪問類的MessageInfo'錯誤聲明爲private類!任何人都可以在Visual Studio 2005上編譯此代碼,以便我知道VS 2005出了什麼問題?