C ++宏给出了C4430错误:缺少类型说明符

时间:2014-07-18 18:10:03

标签: c++ macros

我遵循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

有什么想法吗?

2 个答案:

答案 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 $