Ошибка: использование удаленной функции
Я работал над кодом 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’
Редактировать: это происходит от части кода с использованием Boost MSM: Boost Webpage
Edit2: нет = delete()
используется в любом месте исходного кода.
Вообще говоря, что означает эта ошибка? Что я должен искать, когда происходит этот тип ошибки?
8 ответов
Я не думаю, что другие ответы, упоминающие =deleted;
синтаксис правильный. Сообщение об ошибке ясно говорит о том, что конструктор по умолчанию был удален неявно. В нем даже сказано почему: класс содержит нестатическую константную переменную, которая не будет инициализирована ctor по умолчанию.
class X {
const int x;
};
поскольку X::x
является const
, он должен быть инициализирован - но ctor по умолчанию обычно не инициализирует его (потому что это тип POD). Поэтому, чтобы получить ctor по умолчанию, вам нужно определить его самостоятельно (и он должен инициализировать x
). Вы можете получить ту же самую ситуацию с участником, который является ссылкой:
class X {
whatever &x;
};
Вероятно, стоит отметить, что оба они также отключат неявное создание оператора присваивания, и по той же причине. Оператор неявного присваивания обычно выполняет присваивание по элементам, но в этих случаях он не может этого сделать, потому что этот элемент не может быть назначен. Для выполнения задания вам нужно написать свой собственный оператор присваивания.
Вот почему const
member обычно должен быть статическим - когда вы делаете назначение, вы все равно не можете назначить const. В типичном случае все ваши экземпляры будут иметь одно и то же значение, поэтому они могут также совместно использовать доступ к одной переменной вместо того, чтобы иметь множество копий переменной, которая будет иметь одно и то же значение.
Можно, конечно, создавать экземпляры с разными значениями - вы (например) передаете значение при создании объекта, поэтому два разных объекта могут иметь два разных значения. Однако, если вы попытаетесь что-то сделать, например, поменять их местами, член const сохранит свое первоначальное значение вместо того, чтобы его поменять местами.
Вы используете функцию, которая помечена как deleted
,
Например:
int doSomething( int ) = delete;
= Delete - это новая функция C++0x. Это означает, что компилятор должен немедленно прекратить компиляцию и пожаловаться "эта функция удалена", как только пользователь использует такую функцию.
Если вы видите эту ошибку, вы должны проверить объявление функции для =delete
,
Чтобы узнать больше об этой новой функции, представленной в C++0x, проверьте это.
Я столкнулся с этой ошибкой при наследовании от абстрактного класса и не реализации всех чистых виртуальных методов в моем подклассе.
GCC 4.6 поддерживает новую функцию удаленных функций, где вы можете написать
hdealt() = delete;
отключить конструктор по умолчанию.
Здесь компилятор, очевидно, видел, что конструктор по умолчанию не может быть сгенерирован, и =delete
сделал бы это для вас.
В текущем стандарте C++0x вы можете явно отключить конструкторы по умолчанию с помощью синтаксиса удаления, например
MyClass() = delete;
Gcc 4.6 - первая версия, поддерживающая этот синтаксис, так что, возможно, в этом проблема...
Можете ли вы попробовать это, пожалуйста? У меня нет gcc-4.6
class C
{
public:
const int x ;
} ;
int main()
{
C c ;
}
Должно появиться подобное сообщение об ошибке, если люди здесь правы.
Если вы получаете эту ошибку при инициализацииstd::atomic
переменная такая:
std::atomic_bool b = false;
Тогда это не сработает, потому что здесь используется инициализация копирования , но конструктор копирования явно удаляется.
Вместо этого используйте прямую инициализацию :
std::atomic_bool b{false};