Что это за сообщение об ошибке о неявно удаленных виртуальных деструкторах? - PullRequest
11 голосов
/ 28 сентября 2011

Я только что обновил GCC с (я думаю) 4.5.6 до 4.6.1, под Windows, MinGW.Внезапно мой базовый класс NonInstantiable (от которого вы наследуете общедоступный виртуальный для предотвращения создания экземпляров) отказывается работать со следующими и похожими сообщениями об ошибках:

#ifndef Frigo_Lang_NonInstantiable
#define Frigo_Lang_NonInstantiable

namespace Frigo
{
namespace Lang
{

/**
*   Inherit from this class if you want to make a non-instantiable class. Most
*   useful for static classes. It seems every inheritance combination
*   (public/protected/private, non-virtual/virtual) shuts off instantiation in
*   all subclasses as well.
**/

class NonInstantiable
{
private:
/*  Private Classes  */

    /**
    *   A dummy class to prevent GCC warnings about virtual
    *   constructors/destructors and no friends
    **/
    class NonInstantiableDummy { };

/*  Private Constructors  */

    /**
    *   Private constructor to prevent instantiation
    **/
    NonInstantiable() { }

    /**
    *   Private destructor to prevent instantiation on the stack. Virtual to
    *   prevent GCC warnings
    **/
    virtual ~NonInstantiable() { }

/*  Friends  */
    friend class NonInstantiableDummy;
};

}
}

#endif

Ошибки:

/code/Frigo/Util/Arrays:40:7: error: deleted function 'virtual Frigo::Util::Arrays::~Arrays()'
/code/Frigo/Lang/Object:37:11: error: overriding non-deleted function 'virtual Frigo::Lang::Object::~Object()'
/code/Frigo/Util/Arrays:40:7: error: 'virtual Frigo::Util::Arrays::~Arrays()' is implicitly deleted because the default definition would be ill-formed:
/code/Frigo/Lang/NonInstantiable:39:11: error: 'virtual Frigo::Lang::NonInstantiable::~NonInstantiable()' is private
/code/Frigo/Util/Arrays:40:7: error: within this context
/code/Frigo/Lang/NonInstantiable:39:11: error: 'virtual Frigo::Lang::NonInstantiable::~NonInstantiable()' is private
/code/Frigo/Util/Arrays:40:7: error: within this context
/code/Frigo/Util/Arrays:40:7: error: deleted function 'virtual Frigo::Util::Arrays::~Arrays()'
/code/Frigo/Lang/NonInstantiable:39:11: error: overriding non-deleted function 'virtual Frigo::Lang::NonInstantiable::~NonInstantiable()'

Я подозреваюэто потому, что я не создаю никаких деструкторов, виртуальных или иных, в дочерних классах, и это как-то противоречит частному виртуальному деструктору NonInstantiable, но мне нужно подтверждение.И решение, как исправить мой NonInstantiable класс, чтобы подавить эти ошибки, но все еще работает.

1 Ответ

19 голосов
/ 28 сентября 2011

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

Просто сделайте ваш деструктор защищенным NonInstantiable.

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

РЕДАКТИРОВАТЬ: я должен добавить в качестве отступления, что вы можете захотетьрассмотреть вашу потребность в не инстанцируемом классе здесь.Я лично считаю, что комбинация свободных функций и переменных пространства анонимных имен была бы более чистым способом сделать это.

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