Ошибка: использование удаленной функции

Я работал над некоторым кодом на С++, который написал друг, и я получаю следующую ошибку, которую я никогда раньше не видел при компиляции с gcc4.6:

error: use of deleted function

‘GameFSM_<std::array<C, 2ul> >::hdealt::hdealt()’ is implicitly deleted because the default definition would be ill-formed:
uninitialized non-static const member ‘const h_t FlopPokerGameFSM_<std::array<C, 2ul> >::hdealt::h’

Изменить: это происходит из части кода, использующего boost MSM: Boost Webpage

Edit2: Нет = delete(), используемого в любом месте исходного кода.

Вообще говоря, что означает эта ошибка? Что я должен искать, когда возникает этот тип ошибок?

Ответ 1

Сообщение об ошибке ясно говорит о том, что конструктор по умолчанию был удален неявно. В нем даже сказано почему: класс содержит нестатическую константную переменную, которая не будет инициализирована ctor по умолчанию.

class X {
    const int x;
};

Поскольку X::x - это const, его нужно инициализировать - но ctor по умолчанию обычно не инициализирует его (потому что это тип POD). Поэтому, чтобы получить ctor по умолчанию, вам нужно определить его самостоятельно (и он должен инициализировать x). Вы можете получить такую же ситуацию с участником, как ссылка:

class X { 
    whatever &x;
};

Вероятно, стоит отметить, что оба они также отключат неявное создание оператора присваивания, по сути, по той же причине. Оператор неявного присваивания обычно выполняет присваивание по элементам, но с помощью константного или ссылочного элемента он не может этого сделать, поскольку элемент не может быть назначен. Чтобы задание работало, вам нужно написать свой собственный оператор присваивания.

Вот почему член const обычно должен быть статическим - когда вы делаете назначение, вы все равно не можете назначить член const. В типичном случае все ваши экземпляры будут иметь одно и то же значение, поэтому они могли бы также совместно использовать доступ к одной переменной, вместо того, чтобы иметь множество копий переменной, которая будет иметь одно и то же значение.

Конечно, можно создавать экземпляры с разными значениями - вы (например) передаете значение при создании объекта, поэтому два разных объекта могут иметь два разных значения. Однако, если вы попытаетесь что-то сделать, например, поменять их местами, член const сохранит свое первоначальное значение вместо того, чтобы поменяться местами.

Ответ 2

Вы используете функцию, которая помечена как deleted.
Например:

int doSomething( int ) = delete;

The = delete - это новая функция С++ 0x. Это означает, что компилятор должен немедленно прекратить компиляцию и жаловаться "эта функция будет удалена" после использования пользователем такой функции.

Если вы видите эту ошибку, вы должны проверить декларацию функции для =delete.

Чтобы узнать больше об этой новой функции, введенной в С++ 0x, отметьте этот.

Ответ 3

gcc 4.6 поддерживает новую функцию удаленных функций, где вы можете написать

hdealt() = delete;

чтобы отключить конструктор по умолчанию.

Здесь компилятор явно видел, что конструктор по умолчанию не может быть сгенерирован, а =delete 'd это для вас.

Ответ 4

В текущем стандарте С++ 0x вы можете явно отключить конструкторы по умолчанию с синтаксисом delete, например.

MyClass() = delete;

Gcc 4.6 - первая версия, поддерживающая этот синтаксис, поэтому, возможно, это проблема...

Ответ 5

Вы можете попробовать это, пожалуйста? У меня нет gcc-4.6

class C
  {
public:
  const int x ;
  } ;
int main()
  {
  C c ;
  }

Он должен дать аналогичное сообщение об ошибке, если люди здесь верны.

Ответ 6

Переключение с gcc 4.6 на gcc 4.8 разрешило это для меня.

Ответ 7

Я столкнулся с этой ошибкой, когда наследовал от абстрактного класса и не реализовал все чисто виртуальные методы в моем подклассе.