15

我刚刚在 Windows、MinGW 下将 GCC 从(我认为)4.5.6 更新到 4.6.1。突然,我的 NonInstantiable 基类(您使用 public virtual 继承以防止实例化)拒绝使用以下和类似的错误消息:

#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 类以抑制这些错误的解决方案,但仍然有效。

4

1 回答 1

25

父析构函数总是需要从子类中调用(因为这是自动发生的),因此父类析构函数不能是私有的。

只要让你NonInstantiable的析构函数受到保护。

另请注意,子类可以通过显式(意外?)调用其公共编译器生成的复制构造函数来规避父类。

编辑:我应该补充一点,你可能想在这里考虑你需要一个不可实例化的类。我个人认为自由函数和匿名命名空间变量的组合将是一种更简洁的方式。

于 2011-09-28T17:32:22.813 回答