Pregunta

Dado el siguiente código:

#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;
  }

};

Mi compilador (GCC 4.2) se queja:

- 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));]

Pero no me llamo el constructor de copia!

¿Fue útil?

Solución

Nunca se llama constructor de copia. El constructor de copia se llama siempre para usted implícitamente por el compilador. Así que hay que aprender a reconocer situaciones en las que podría ser llamado.

Al adjuntar una referencia constante a un objeto temporal

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

el compilador tiene derecho a realizar una copia del objeto temporal y requieren un constructor de copia accesible (incluso si no se llama en realidad). Esto es lo que está causando el problema en su caso.

En otras palabras, cuando se hace algún tipo no copiable, que también dan la posibilidad de adjuntar referencias a objetos const temporales de ese tipo.

Otros consejos

En primer lugar, retire la derivación privado desde SpecialFilter - no es necesario, como filtro ya no es copiable. Los problemas de este tipo son por las que creo soluciones como impulso :: non_copyable son una mala idea - hay maneras más simples de decir que no desea copias

.

En segundo lugar, aunque no estoy seguro de que este es su problema, C ++ dice que una copia constructor público debe estar disponible para el compilador bajo varios circimstances, incluso si el compilador en realidad no lo utilizan .

Recuerde que cuando se pasa objeto y el objeto devuelto por el valor -.> Constructor de copia se invoca

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top