Я только что обновил 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 класс, чтобы подавить эти ошибки, но все же работать.