我遵循Google的C ++风格指南,建议:对于类,应该添加宏
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
class MyClass {
...
DISALLOW_COPY_AND_ASSIGN(MyClass);
};
#undef DISALLOW_COPY_AND_ASSIGN
我将这个宏添加到项目中的许多类中。当我编译时,我收到错误:
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
有什么想法吗?
答案 0 :(得分:4)
错误发生在...
部分。另外,delete
你的副本和协助操作员不仅仅隐藏它们
class Foo
{
public:
Foo(Foo&) = delete;
Foo& operator=(const Foo&) = delete;
}
请注意delete
是c ++ 11功能
答案 1 :(得分:2)
我确实相信你错过了一个分号:
void operator=(const TypeName&)
由于这是低估的,我会证明这一点。
这是您的原始代码(删除了...
并添加了一些其他内容以使其实际编译您的类),无法编译:
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
class MyClass {
public: MyClass()
:
mN (42)
{
}
private:
int mN;
DISALLOW_COPY_AND_ASSIGN(MyClass)
long mL;
};
#undef DISALLOW_COPY_AND_ASSIGN
int main()
{
MyClass c;
}
在G ++ 4.8下,编译器抱怨:
jdibling@hurricane /home/jdibling/dev/hacks $ g++ main.cpp
main.cpp:3:33: error: expected ‘;’ at end of member declaration
void operator=(const TypeName&)
^
main.cpp:14:1: note: in expansion of macro ‘DISALLOW_COPY_AND_ASSIGN’
DISALLOW_COPY_AND_ASSIGN(MyClass)
^
如果我们编辑宏定义以包含分号:
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&);
它编译干净:
jdibling@hurricane /home/jdibling/dev/hacks $ g++ main.cpp
jdibling@hurricane /home/jdibling/dev/hacks $