2012-07-07 15 views
10

Esta es una pregunta no relacionada sobre el código en this question, con respecto a la siguiente función de plantilla.error: inicialización no válida de la referencia de tipo 'int &' de la expresión de tipo 'const int'

template <class T> 
class Object : public Container { 
public: 
    T& object; 

    Object(const T& obj) : object(obj) {} 
}; 

Este es el código que llama al constructor:

template <class T> 
void Array::add_element(const T& element) 
{ 
    vec.push_back(new Object<T>(element)); 
} 

Este código compila bien, pero tan pronto como se agrego una línea en main que lo llama:

Array array; 
int i = 3; 
array.add_element(i); 

I obtener una advertencia del compilador: error: invalid initialization of reference of type 'int&' from expression of type 'const int'.

¿De qué se trata? Pasé un int in. ¿No debería convertirse automáticamente en un const int& para mí? ¿Por qué se queja el compilador?

+6

Consejo: 'T & objeto;' - También, 'const T & obj = nullptr' no tiene ningún sentido , no puede inicializar una referencia a 'nullptr'. – Xeo

+0

¿Cómo es eso una pista? Así es exactamente como 'object' ya está declarado. Y gracias, cambiaré eso. – anthropomorphic

+2

Es una pista porque no se puede inicializar una referencia no const desde una referencia const - const-correctness 101. – ildjarn

Respuesta

12

obj es una referencia de referencia. object es una referencia no const.

No se puede inicializar una referencia no constante a partir de una referencia constante, ya que al hacerlo se frustraría el propósito de tener una referencia directa en primer lugar.

Si desea que su instancia de Object pueda modificar el int que se transfiere a su constructor, el constructor debe tomar una referencia no constante. Si no lo hace, entonces el miembro de datos debe ser una referencia constante.

En cualquier caso, está almacenando problemas para usted si usa new para asignar objetos que tienen referencias como miembros de datos. Es su problema para asegurar que se elimina la Object antes i sale del ámbito (o en cualquier caso, asegúrese de que la Object no utiliza su miembro object después i sale del ámbito.

+0

Excelente respuesta. Ahora funciona. – anthropomorphic

8

Estás tratar de asignar una referencia constante para una referencia no const. Esto significa que su clase de objetos puede modificar el contenido del objeto.

const int myConstNumber = 4; 
Object<int> intObj(myConstNumber); 

intObj.object = 3; // you have indirectly modified the value of myConstNumber 

C++ no le permiten hacer eso. puede hacer una copia del objeto o añadir el const a su atributo.

template <class T> 
class Object : public Container { 
public: 
    T object; // valid 

o

template <class T> 
class Object : public Container { 
public: 
    const T& object; // valid 

en este caso no se puede modificar objeto

+1

Gracias, su respuesta también es buena, pero primero en llegar primero, lo siento =/ – anthropomorphic

+6

Está bien, estoy aquí para ayudar, no para elogios. :) – ilmale

Cuestiones relacionadas