elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error C2662 - const
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error C2662 - const  (Leído 2,426 veces)
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Error C2662 - const
« en: 7 Julio 2019, 18:15 pm »

Hola amigos..

En el siguiente código, si yo quito la palabra const (línea 52) derivada de un template tipo C, el programa corre....


Link -> https://onlinegdb.com/SyW1F9kWS
Hagan clic en Fork para probar el código.

Estuve buscando por què pasa esto, segun el compilador no pudo realizar una conversion de un tipo que no es const a uno que es const...  entiendo que quitando la palabra const se acaba el problema, pero por que?.. y si no deseo retirar la palabra const donde mas debería agregarla para que pueda compilar?... (Pasa que el libro que estudio aparece con const, ero no veo diferencia realmente con lo que tengo).

Gracias.



Bueno, según un usuario de discord, me dijo que las funciones begin() y end() deben ser const también, y efectivamente colocándolas asi compiló correctamente.

Pero es curioso porque en el libro que estudio, dichas funciones no son const..

Ahora mismo estoy investigando por que´.



Si yo coloco las funciones begin() y end() como funciones no miembro, es decir, fuera de la clase o estructura, el compilador no las detecta...

Lnik -> https://onlinegdb.com/SJgL5ayZH


Debe forzosamente ser funciones miembro?

EI: NO HAGAS DOBLE POST NUEVAMENTE, SERA BORRADO.


« Última modificación: 7 Julio 2019, 23:00 pm por Eternal Idol » En línea

Dungeons & dragons;
dragons.Attack();
RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: Error C2662 - const
« Respuesta #1 en: 8 Julio 2019, 02:20 am »

Lo que pasa es que si tienes un objeto/struct const (o una referencia o puntero a objeto const), sólo puedes invocar a sus funciones miembro que también sean const. Si no fuera así, no habría forma de garantizar que el objeto sea realmente const (piensa, por ejemplo, que podrías llamar a sus "setters", con lo cual estarías modificando alguna de sus variables miembro). Al declarar una función como const, estás indicando que no modificarás ningún miembro del objeto, y el compilador se asegurará de que así sea: si dentro de una función miembro const intentas modificar alguna variable miembro, se producirá un error.

Ahora, cuando tienes algo como esto:

Código
  1. for (auto i : obj)

y obj hace referencia a un objeto, el "range-based for" internamente llama a obj.begin() y obj.end(), así que si obj es const, esas dos funciones también deben serlo, o el compilador no dejará que sean invocadas.


« Última modificación: 8 Julio 2019, 02:27 am por RayR » En línea

Loretz

Desconectado Desconectado

Mensajes: 117


Ver Perfil
Re: Error C2662 - const
« Respuesta #2 en: 8 Julio 2019, 02:38 am »

En general necesitas las dos versiones para begin y para end, las const y no const, para que pueda usarse la que corresponda en cada caso.

Por ejemplo, si tienes: definidas las cuatro funciones miembro:
Código
  1. template <typename T>
  2.    T* s<T>::begin() {
  3.        return elem;
  4.    }
  5.  
  6.    template <typename T>
  7.    const T* s<T>::begin() const {
  8.        return elem;
  9.    }
  10.  
  11.    template <typename T>
  12.    T* s<T>::end() {
  13.        return begin() + size;
  14.    }
  15.  
  16.    template <typename T>
  17.    const T* s<T>::end() const {
  18.        return begin() + size;
  19.    }

Podrás usar tanto
Código
  1. template <typename C, typename V>
  2. V sum(C& c, V v) {  // c es una referencia no constante
  3.    for (auto a : c) { // usa las versiones no const de begin() y de end()
  4.        v += a;
  5.    }
  6.    return v;
  7. }

como
Código
  1. template <typename C, typename V>
  2. V sum(const C& c, V v) {  // c es una referencia constante
  3.    for (auto a : c) {          // usa las versiones const de begin() y de end()
  4.        v += a;
  5.    }
  6.    return v;
  7. }
En línea

digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Error C2662 - const
« Respuesta #3 en: 8 Julio 2019, 03:53 am »

Muy bien, buenísimas explicaciones, me quedó claro, entonces es una regla del compilador todo esto, ahora le hallo sentido...

@Loretz si tienes tu libro a mano, veras que en la pagina 78 se usa la version const, pero en la pagina 77 solo están definidos begin() y end() de forma no constante... entonces supongo que la reseña esta imcompleta... verdad?
En línea

Dungeons & dragons;
dragons.Attack();
RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: Error C2662 - const
« Respuesta #4 en: 8 Julio 2019, 04:08 am »

Por cierto, respecto a tu segunda pregunta, begin y end no necesariamente debe ser funciones miembro, pero en caso de que sean funciones sueltas, necesitan estar en el mismo namespace que el objeto para que el compilador las encuentre; sin embargo, en ese caso hacer que puedas usarlos con objetos const se complica más, y tendrías que declarar versiones de begin y end que acepten y retornen const, así como una sobrecarga de sólo lectura (const) del operador [].
En línea

digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Error C2662 - const
« Respuesta #5 en: 8 Julio 2019, 04:40 am »

Asi es, lo he notado, no pude declarar las funciones no miembro como const... pero no me haré problemas al menos por ahora y las declarare como funciones miembro...

saludos.
En línea

Dungeons & dragons;
dragons.Attack();
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
problema con CONST
Programación C/C++
_niu 1 1,487 Último mensaje 10 Enero 2012, 03:00 am
por Littlehorse
[SOLUCIONADO] C++ - Error al usar "const" en funciones de una clase.
Programación C/C++
xaps 1 3,202 Último mensaje 18 Noviembre 2013, 10:37 am
por xaps
Error const char no es compatible con LPCWSTR. « 1 2 »
Programación C/C++
NikNitro! 12 13,479 Último mensaje 30 Abril 2014, 22:43 pm
por Eternal Idol
(Ayuda) Error al modificar el valor de un char en una cadena const char *
Programación C/C++
Seyro97 4 7,524 Último mensaje 2 Julio 2015, 15:17 pm
por Seyro97
const vs define
Programación C/C++
turinga18 2 1,796 Último mensaje 16 Agosto 2017, 16:28 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines