鉴于以下代码:

#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, SpecialFilter(123, 321));]

但我不调用拷贝构造函数!

有帮助吗?

解决方案

您永远不会调用拷贝构造函数。拷贝构造函数总是由编译器要求你含蓄。所以,你需要学会识别的情况时,它可能会被调用。

当附加const引用到一个临时对象

...
return filter(channel, SpecialFilter(123, 321));
...

,编译器来执行临时对象的副本,并且需要访问的拷贝构造(即使它不会被实际调用)的权利。这就是你的情况引起的问题。

在换句话说,当你做出某种类型的不可复制,还放弃附加到该类型的暂时对象的引用常量的可能性。

其他提示

首先,移除SpecialFilter私人推导 - 这是不必要的,因为过滤器已经是不可拷贝。像这样的问题,为什么我认为像升压解决方案:: non_copyable是一个糟糕的主意 - 有说你不想复制的简单的方法

其次,虽然我不知道这是你的问题,C ++说,一个公共的拷贝构造函数必须提供给下编译几个circimstances,即使编译器不实际使用它的。

记住当你通过对象,并通过返回值对象 - >复制构造函数被调用

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top