Макрос C ++ выдает ошибку C4430: отсутствует спецификатор типа

0

Я следую руководству по стилю 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
    Что такое ... ?
  • 0
    Проверьте выход препроцессора и убедитесь, что он правильный.
Показать ещё 18 комментариев
Теги:
macros

2 ответа

4
Лучший ответ

Ошибка в ... части. Также лучше delete свою копию и убеждать оператора не просто скрывать их

class Foo
{
public:
    Foo(Foo&) = delete;
    Foo& operator=(const Foo&) = delete;
}

Обратите внимание: delete - это функция С++ 11

  • 0
    Обратите внимание, что это будет работать только под C ++ 11. Руководство по стилю Google предшествует этому стандарту.
  • 0
    @JohnDibling хороший момент, я добавлю его в свой ответ
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 $ 
  • 0
    Это будет работать: http://ideone.com/foqmNr
  • 0
    Я не думаю, что это причина.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню