2013-09-24 59 views
3

有人可以幫助我理解這個錯誤,當我在函數中聲明結構本地時,我從編譯器得到錯誤。但是當我在函數之外聲明結構時,錯誤消失了。爲什麼在函數中本地定義的結構需要賦值運算符和拷貝構造函數

注意:我沒有有意實現缺失功能。我只是想知道爲什麼編譯器需要他們,當我不使用我的代碼

RAII :: RAII「:本地類的成員函數沒有一個身體

RAII ::運算符=」:本地類的成員函數沒有一個身體

void someclass::somefun() 
{ 
    static bool inProgress = false; 
    struct RAII 
    { 
     RAII(bool& f):flag(f){ flag = true;} 
     ~RAII() { flag = false; } 
     bool& flag; 
    private: 
     RAII(const RAII& rhs); 
     RAII& operator= (const RAII& rhs); 
    }; 
    RAII autoreset(inProgress); 

    // Do something 

} 
+1

由於'本地類成員函數沒有主體',因此。換句話說,顯然**是地方班級的特殊規則。 – Griwes

+0

@Griwes感謝您的反對票,但我真的很想知道誰在使用複製構造函數和賦值運算符。我沒有看到我的代碼。 – Satbir

+1

這是警告,而不是錯誤 – billz

回答

8

所以標準包含此規則:9.3.1p8

本地類的成員函數應該在其類定義中內聯定義(如果它們是完全定義的話)。

這使得本地類的成員不在線定義。

微軟的編譯器顯然是偏執於此,並有一級警告C4822,它警告你聲明一個成員而不定義它的那一刻。這完全是braindead - 當你實際上確實定義了一個不成員的成員時,它應該給出一個好的錯誤信息。

正確的做法是在每個項目中禁用此警告,並繼續做你正在做的事情。

編輯:顯然,微軟的人也意識到這個警告是多麼愚蠢,並在新版本中被刪除。 MSDN不包含有關Visual Studio 2008以上版本的此警告的文檔。

相關問題