3

有人可以帮我理解这个错误吗,当我在函数中本地声明结构时,我从编译器得到以下错误。但是当我在函数之外声明结构时错误消失了。

注意:我没有故意实现缺少的功能。我只是想知道为什么当我不在我的代码中使用时编译器需要它们

RAII::RAII' : 本地类成员函数没有主体

RAII::operator =' : 本地类成员函数没有主体

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 

}
4

1 回答 1

8

所以标准包含这条规则:9.3.1p8

本地类的成员函数应在其类定义中内联定义,如果它们被定义的话。

这取缔了本地类成员的离线定义。

Microsoft 编译器显然对此持偏执态度,并且有一个级别 1 警告 C4822,它会在您声明一个成员而不定义它的那一刻发出警告。这完全是脑残——当你真正定义一个不符合要求的成员时,它应该只是给出一个很好的错误消息。

正确的做法是在每个项目中禁用此警告并继续做你正在做的事情。

编辑:显然,微软的人也意识到这个警告是多么愚蠢,并在新版本中将其删除。对于高于 Visual Studio 2008 的版本,MSDN 不包含此警告的文档。

于 2013-09-24T11:01:56.820 回答