2010-01-06 45 views
0
class test 
{ 
private: 
    class privateStruct 
    { 
    public: 
     int m; 
     privateStruct(int p){m=p;} 
    }; 
}; 

void ff() 
{ 
    test::privateStruct ps(4); 
    throw ps; //Does not work.. 
} 

void main() 
{ 
    try 
    { 
     ff(); 
    } 
    catch(...) 
    { 
    } 
} 

但是,下面的代碼工作爲什麼訪問公共類功能的專用類給錯誤

class test 
{ 
private: 
    class privateStruct 
    { 
    public: 
     int m; 
     privateStruct(int p){m=p;} 
    }; 
}; 

void ff() 
{ 
    throw test::privateStruct(4); //Work why 
} 

void main() 
{ 
    try 
    { 
     ff(); 
    } 
    catch(...) 
    { 
    } 
} 

注:我使用VC++ 6.0

我需要回答爲什麼上面的代碼工作。

感謝提前:)

+1

使用哪個編譯器做第二個例子「工作?」 Microsoft Visual C++ 2008和Windows版英特爾C++編譯器11都無法編譯它,因爲'privateStruct'無法訪問。 – 2010-01-06 05:30:38

+0

我會補充說gcc4.4也不會編譯其中的任何一個,出於同樣的原因。 – 2010-01-06 05:32:14

回答

0

即使是第二代碼片段將無法編譯。無法在函數ff()中訪問privateStruct。

1

你的第二個例子中的代碼是可行的,因爲Visual C++ 6因其可怕的標準遵從而臭名昭着。

它意外工作。

4

這是Visual Studio 6.0的一箇舊的/已知的錯誤。它在構造臨時對象時忽略訪問說明符。沒有修復程序可用。

將警告等級提高到3或更高(/ W3)將導致違規代碼發出警告。