我有几个我不想被复制的类,其中一些类具有指针数据成员。为了使这些类不可复制,我私下继承了以下类模板:
template <class T>
class Uncopyable
{
protected:
Uncopyable() {}
virtual ~Uncopyable() {}
private:
Uncopyable(const Uncopyable &);
T & operator=(const T&);
};
我这样使用:
class Entity : private Uncopyable<Entity> { }
这很好,但是当我使用-Weffc++编译时,仍然收到以下警告:
class Entity has pointer data members
but does not override Entity(const Entity&)
or operator=(const Entity&)
为什么仍然会给我这个警告?
最佳答案
C++说
代码中的错误是您的基类声明operator=
接受派生类类型的引用。那将不会阻止对操作符隐式地公开声明基数。因此,您的派生类和您的基类仍然可以分配。尝试将不可复制的类更改为非模板,这应足以:
class Uncopyable
{
protected:
Uncopyable() {}
virtual ~Uncopyable() {}
private:
Uncopyable(const Uncopyable &);
Uncopyable & operator=(const Uncopyable&);
};
我刚刚在该代码中想到了另一件事:不要将Uncopyable虚拟函数作为析构函数。原因是,除了派生类本身之外,没有人可以对指向Uncopyable的指针调用delete(因为1:析构函数受到保护,2:您私下派生)。因此,将派生类的析构函数隐式虚拟化是Uncopyable的问题。如果派生类需要具有虚拟析构函数,则将virtual放入其中,并将Uncopyables的析构函数保留为非虚拟。
关于c++ - 使用 “Uncopyable”类时静默GCC警告,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/394854/