ошибка: использование удаленной функции - PullRequest
97 голосов
/ 11 мая 2011

Я работал над кодом C ++, который написал друг, и я получаю следующую ошибку, которую никогда не видел при компиляции с 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’

Редактировать: это происходит из части кода, использующей повышение MSM: Повышение веб-страницы

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

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

Ответы [ 6 ]

143 голосов
/ 11 мая 2011

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

class X {
    const int x;
};

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

class X { 
    whatever &x;
};

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

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

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

6 голосов
/ 11 мая 2011

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

int doSomething( int ) = delete;

= delete - это новая функция C ++ 0x.Это означает, что компилятор должен немедленно прекратить компиляцию и выдать жалобу «эта функция удалена», как только пользователь использует такую ​​функцию.

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

Чтобы узнать больше об этой новой функции, представленной в C ++ 0x, отметьте this out.

2 голосов
/ 11 мая 2011

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

hdealt() = delete;

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

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

1 голос
/ 14 декабря 2013

Переход с gcc 4.6 на gcc 4.8 решил эту проблему для меня.

1 голос
/ 11 мая 2011

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

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

Должно появиться подобное сообщение об ошибке, если люди здесь правы.

1 голос
/ 11 мая 2011

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

MyClass() = delete;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...