Я работал над некоторым кодом 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()
нигде в исходном коде не используется.
Вообще, что означает эта ошибка? Что мне следует искать при возникновении этого типа ошибки?
Ответы:
В сообщении об ошибке четко указано, что конструктор по умолчанию был удален неявно . Он даже говорит, почему: класс содержит нестатическую переменную const, которая не будет инициализирована ctor по умолчанию.
Поскольку он
X::x
естьconst
, он должен быть инициализирован, но ctor по умолчанию обычно не инициализирует его (потому что это тип POD). Следовательно, чтобы получить ctor по умолчанию, вам нужно определить его самостоятельно (и он должен инициализироватьсяx
). Вы можете получить такую же ситуацию с членом, который является ссылкой:Вероятно, стоит отметить, что оба они также отключают неявное создание оператора присваивания, по сути, по той же причине. Оператор неявного присваивания обычно выполняет присваивание по членам, но с константным или ссылочным членом он не может этого сделать, потому что член не может быть назначен. Чтобы присваивание работало, вам нужно написать собственный оператор присваивания.
Вот почему
const
член обычно должен быть статическим - когда вы выполняете назначение, вы все равно не можете назначить член const. В типичном случае все ваши экземпляры будут иметь одно и то же значение, поэтому они могут также иметь общий доступ к одной переменной вместо того, чтобы иметь множество копий переменной, которые все будут иметь одно и то же значение.Конечно, можно создавать экземпляры с разными значениями - вы (например) передаете значение при создании объекта, поэтому два разных объекта могут иметь два разных значения. Однако если вы попытаетесь сделать что-то вроде их замены, член const сохранит свое исходное значение вместо того, чтобы быть замененным.
источник
C++ error: use of deleted function
Вы используете функцию, отмеченную как
deleted
.Например:
Знак = delete - это новая функция C ++ 0x. Это означает, что компилятор должен немедленно прекратить компиляцию и пожаловаться на то, что «эта функция удалена», как только пользователь использует такую функцию.
Если вы видите эту ошибку, вам следует проверить объявление функции для
=delete
.Чтобы узнать больше об этой новой функции, представленной в C ++ 0x, посмотрите это .
источник
C++ error: use of deleted function
gcc 4.6 поддерживает новую функцию удаленных функций, где вы можете написать
чтобы отключить конструктор по умолчанию.
Здесь компилятор, очевидно, увидел, что конструктор по умолчанию не может быть сгенерирован, и сделал
=delete
это за вас.источник
Я столкнулся с этой ошибкой при наследовании от абстрактного класса и не реализации всех чистых виртуальных методов в моем подклассе.
источник
public virtual
от базового класса 2-го уровня, где базовый класс 1-го уровня имел явно удаленный конструктор по умолчанию. Удалениеvirtual
устранило проблему, не применяя все методы.В текущем стандарте C ++ 0x вы можете явно отключить конструкторы по умолчанию с помощью синтаксиса удаления, например
Gcc 4.6 - первая версия, поддерживающая этот синтаксис, так что, возможно, проблема в этом ...
источник
Gcc 4.6 is the first version to support this syntax
Думаю, это объясняет, почему я никогда не видел его раньше, поскольку недавно начал использовать gcc4.6.Переход с gcc 4.6 на gcc 4.8 решил эту проблему.
источник