2010-12-01 14 views
5

me encontré con este pedazo de código en la fuente OPENCV (cxoperations.hpp, línea 1134, en la definición de la clase Vector):OpenCV se escapa con la asignación a una referencia constante?

Vector(const Vector& d, const Range& r) 
{ 
    if(r == Range::all()) 
     r = Range(0, d.size()); 

    // some more stuff... 
} 

Tenga en cuenta que la clase Vector no tiene un elemento de datos llamado r (y, de hecho, el identificador r solo aparece en un lugar más en toda la definición de clase, como un parámetro en otro método). Entonces, aparentemente, hay una asignación a una referencia const.

he intentado reproducir un ejemplo mínimo:

#include <iostream> 

class Foo 
{ 
    public: 
    int _a; 
    Foo(int a) : _a(a) {} 
}; 

int main() 
{ 
    Foo x(0); 
    const Foo& y = x; 
    printf("%d\n", y._a); 
    y = Foo(3); 
    printf("%d\n", y._a); 
} 

Esto, por supuesto, falla al compilar: g ++ da el error

test.cpp:15: error: passing `const Foo' as `this' argument of `Foo& Foo::operator=(const Foo&)' discards qualifiers 

La única manera que tengo para trabajar es anulando operator= así:

#include <iostream> 

class Foo 
{ 
    public: 
    int _a; 
    Foo(int a) : _a(a) {} 
    Foo& operator=(Foo rhs) const 
    { 
     Foo& tmp = const_cast<Foo&>(*this); 
     tmp._a = rhs._a; 
     return const_cast<Foo&>(*this); 
    } 
}; 

int main() 
{ 
    Foo x(0); 
    const Foo& y = x; 
    printf("%d\n", y._a); 
    y = Foo(3); 
    printf("%d\n", y._a); 
} 

esto compila, y representa un "0 3" como se esperaba. El problema aquí es que

  1. cualquier persona que escribe código como el que debe tener las manos cortadas
  2. en la fuente OPENCV anteriormente, no hay ninguna redefinición de operator= que se lleva a Range parámetros (Range funciones relacionados con la PI son justo por encima la definición de Vector, comenzando en la línea 1033)

Obviamente me falta algo, ya que compila la fuente openCV. Mi pregunta es, ¿qué entra realmente en la línea r = Range(0, d.size()); que lo hace legal?

+0

Necesitaremos ver la implementación (o al menos declaración) de Range :: operator = para responder a su pregunta ... – Staffan

+0

Hay un grupo de funciones 'Range :: operator' definidas justo antes de la clase' Vector' , aunque 'operator =' no es uno de ellos. Presumiblemente, es el operador predeterminado implícitamente definido. – suszterpatt

Respuesta

7

Veo cv's Vector es una plantilla de clase. Entonces, si ese método de clase nunca fue instanciado, no hubo error de compilación. Supongo que si pruebas

Vector<int> a; 
Vector<int> b(a, Range::all()); 

obtendrás un error de compilación en esa línea sospechosa. Entonces puede informarlo como un error en la fuente de OpenCV.

2

Mi teoría es que el código ofensivo nunca se usa y, por lo tanto, nunca se crea una instancia. Vector es una plantilla, después de todo.

consideran este código:

template <class T> 
class Vector 
{ 
public: 
    Vector() 
    { 
    } 

    Vector(const Vector & x, const int & y) 
    { 
     y = 54; 
    } 
}; 
// template class Vector<float>; 

void foo() 
{ 
    Vector<float> v1; 
// Vector<float> v2(v1, 42); 
} 

GCC (versión 4.5.1) acepta esto, pero se queja tan pronto como se agrega esa llamada al segundo constructor o la creación de instancias de plantilla eplicit.

0

Sugiero que lo envíe como un informe de error here, o publique su mensaje en el grupo de noticias OpenCV ya sea en Y!G o directamente a la lista de desarrolladores en "[email protected]".

Cuestiones relacionadas