c – 没有调用复制构造函数,但编译器抱怨没有
发布时间:2020-12-16 03:28:29 所属栏目:百科 来源:网络整理
导读:给出以下代码: #include boost/noncopyable.hppenum Error { ERR_OK=0 };struct Filter : private boost::noncopyable{ Filter() {} virtual ~Filter() {} virtual int filter(int* data) const = 0;};struct SpecialFilter : public Filter,private boost:
给出以下代码:
#include <boost/noncopyable.hpp> enum Error { ERR_OK=0 }; struct Filter : private boost::noncopyable { Filter() {} virtual ~Filter() {} virtual int filter(int* data) const = 0; }; struct SpecialFilter : public Filter,private boost::noncopyable { inline SpecialFilter(unsigned int min,unsigned int max) : min(min),max(max) {} virtual ~SpecialFilter() {} virtual int filter(int* data) const { // ... return ERR_OK; } unsigned int min; unsigned int max; }; struct AClass { AClass() {} AClass(const AClass& other) {} ~AClass() {} int specialFilter(int channel,int minThreshold,int maxThreshold) { // ... return filter(channel,SpecialFilter(123,321)); } int filter(int channel,const Filter& filter) { // ... return ERR_OK; } }; 我的编译器(GCC 4.2)抱怨: - warning: direct base ‘boost::noncopyable_::noncopyable’ inaccessible in ‘SpecialFilter’ due to ambiguity - noncopyable.hpp: In copy constructor ‘Filter::Filter(const Filter&)’: - noncopyable.hpp:27: error: ‘boost::noncopyable_::noncopyable::noncopyable(const boost::noncopyable_::noncopyable&)’ is private - synthezised method first required here: [return filter(channel,321));] 但是我没有调用复制构造函数! 解决方法
你永远不会调用复制构造函数.复制构造函数总是由编译器隐式调用.因此,您需要学习识别可能被调用的情况.
将const引用附加到临时对象时 ... return filter(channel,321)); ... 编译器有权执行临时对象的副本并需要可访问的复制构造函数(即使它实际上不会被调用).这就是导致问题的原因. 换句话说,当你使某些类型不可复制时,你也放弃了将const引用附加到该类型的临时对象的可能性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |