有人帮我理解这个错误,当我在函数中声明struct local时,我从编译器得到以下错误。但是当我在函数之外声明struct时,错误就消失了。
注意:我没有故意实现缺失功能。我只是想知道为什么编译器在我不在我的代码中使用时需要它们。
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
}
答案 0 :(得分:8)
因此该标准包含此规则:9.3.1p8
本地类的成员函数应在其类定义中内联定义,如果它们被定义的话。
这禁止本地班级成员的外线定义。
微软的编译器显然对此有些偏执,并且有一级警告C4822,它会在你定义成员而不定义成员时发出警告。这完全是脑卒中 - 当你真正定义一个成员之外时,它应该只是给出一个很好的错误信息。
正确的做法是在每个项目中禁用此警告并继续执行您正在执行的操作。
编辑:显然,微软的人们也意识到这个警告是多么愚蠢,并在新版本中将其删除。对于比Visual Studio 2008更新的版本,MSDN不包含此警告的文档。