Я следую руководству по стилю 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
Есть идеи?
Ошибка в ...
части. Также лучше delete
свою копию и убеждать оператора не просто скрывать их
class Foo
{
public:
Foo(Foo&) = delete;
Foo& operator=(const Foo&) = delete;
}
Обратите внимание: delete
- это функция С++ 11
Я верю, что вам не хватает точки с запятой:
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 $
...
?