Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Hacer que el parámetro de la plantilla no sea un objeto

Estas en el tema de Hacer que el parámetro de la plantilla no sea un objeto en el foro de C/C++ en Foros del Web. Sobrecargando un operador me di cuenta que en las plantillas también funcionan con objetos. Quiero decir, estas funciones son ambiguas: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver ...
  #1 (permalink)  
Antiguo 16/10/2014, 09:17
 
Fecha de Ingreso: octubre-2014
Mensajes: 23
Antigüedad: 9 años, 5 meses
Puntos: 0
Pregunta Hacer que el parámetro de la plantilla no sea un objeto

Sobrecargando un operador me di cuenta que en las plantillas también funcionan con objetos. Quiero decir, estas funciones son ambiguas:
Código C++:
Ver original
  1. template<class T>
  2. class Myclass {
  3. public:
  4. template<typename T_1>
  5. Myclass<int> operator * (T_1);
  6.  
  7. template<typename T_1>
  8. Myclass<int> operator * (const Myclass<T_1> &);
  9. }
  10.  
  11. // Siendo E, D y C objetos Myclass esto es ambiguo
  12. D=C*E;
  13.  
  14. // Mientras que esto no es ambiguo
  15. D=C*4;
Mi duda sería cómo limitar a la plantilla para que no acepte objetos. (Si se puedo esto sería una posible solución)

O en caso de que no se pueda, si se puede hacer una única función. Y con un if dentro para cada versión de la función, leyendo algun identificador del tipo de dato.¿?
Muchas Gracias de antemano
  #2 (permalink)  
Antiguo 16/10/2014, 09:40
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 5 meses
Puntos: 204
Respuesta: Hacer que el parámetro de la plantilla no sea un objeto

Los operadores binarios deberían estar declarados como miembros "friend" de la clase afectada. Esto permite, por ejemplo, que las operaciones puedan ser simétricas, es decir, se puedan intercambiar los dos elementos que rodean la operación sin penalizaciones:

Código C++:
Ver original
  1. class POO
  2. {
  3.   friend POO operator+( const POO& ar_poo, int numero );
  4.   friend POO operator+( int numero, const POO& ar_poo );
  5. }
  6.  
  7. POO operator+( const POO& ar_poo, int numero )
  8. {
  9.   // ...
  10. }
  11.  
  12. POO operator+( int numero, const POO& ar_poo )
  13. {
  14.   // ...
  15. }
  16.  
  17. // ...
  18.  
  19. int main( )
  20. {
  21.   POO poo;
  22.  
  23.   // ambas operaciones son válidas:
  24.   poo = poo + 4;
  25.   poo = 4 + poo;
  26. }

Lo anterior es un comentario en voz alta acorde con el tema que estás tocando.

Tu código la verdad es que es un poco confuso... no suele tener demasiado sentido que hagas un template y que dicho template devuelva una versión especializada de sí mismo... los templates, debido a que no se comportan exactamente con lo haría una clase, debes tratarlos con cierto respeto.

Si quieres realizar operaciones que devuelvan templates especializados deberías meter dichas operaciones en funciones externas al template.
  #3 (permalink)  
Antiguo 16/10/2014, 11:30
 
Fecha de Ingreso: octubre-2014
Mensajes: 23
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: Hacer que el parámetro de la plantilla no sea un objeto

Gracias, así ya me fue, no entendi muy bien por qué, pero cierto es que si declaro los operadores como friend se ve mejor el código.
  #4 (permalink)  
Antiguo 16/10/2014, 13:17
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Hacer que el parámetro de la plantilla no sea un objeto

Cita:
Iniciado por alexpglez98 Ver Mensaje
Mi duda sería cómo limitar a la plantilla para que no acepte objetos.
No puedes.
int a; está diciendo que a es un objeto de tipo int.

Me da la impresión de que estás tratando de resolver primero tu ejercicio para después tratar de entenderlo, y que nuestras amables y esforzadas intervenciones ayudan grandemente a que continúes en la senda equivocada.

Francamente creo que te sería de mucho mayor provecho ir avanzando en el conocimiento del lenguaje de una manera algo más sistemática, en principio me dá la impresión de que te vendría muy bien algún amigo que hiciera de tutor, tomar un curso, seguir algún tutorial sistemáticamente, y por supuesto, comprar algún buen libro para empezar. Y por supuesto, los foros como éstos son ideales para resolver dudas y para indagar sobre posibilidades que uno no encontró entre los recursos que ya tiene, y creo que ese debería ser el orden, no el inverso.

Lareto :)
  #5 (permalink)  
Antiguo 16/10/2014, 15:10
 
Fecha de Ingreso: octubre-2014
Mensajes: 23
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: Hacer que el parámetro de la plantilla no sea un objeto

Gracias por las respuestas.
Y gracias por el consejo, pero no es tan así. En realidad no tengo a nadie en mi entorno que me enseñe y ayude con programacion, ni voy a ninguna clase de programacion, pienso que podria haber alguna asignatura en bachillerato...). He ido aprendiendo programación de libros, y hace poco me lei un libro de C++ (aunque lo deje en pausa por el capitulo de la herencia). En resumen, es dificil ser autodidacta, por eso me apunte al foro, y no he podido encontrar nada de esto por el libro o internet...
  #6 (permalink)  
Antiguo 16/10/2014, 15:30
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Hacer que el parámetro de la plantilla no sea un objeto

El estudio autodidacta es el más difícil, sobre todo por esa extraordinaria e inconmovible tendencia a repetir los mismos errores una y otra vez.

Rompe el chanchito para una buena inversión:

http://www.amazon.com/Programming-Principles-Practice-Using-2nd/dp/0321992784/ref=la_B000AQ349S_1_2?s=books&ie=UTF8&qid=14134947 94&sr=1-2

Lareto :)
  #7 (permalink)  
Antiguo 17/10/2014, 16:43
 
Fecha de Ingreso: octubre-2014
Mensajes: 23
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: Hacer que el parámetro de la plantilla no sea un objeto

Gracias, cuando tenga tiempo me lo pillaré y leeré, parece bastante bueno.
El autodidactismo me parece genial por una parte, haces que la persona realmente trabaje, le guste aprender y pueda ir a ritmo que quiera, pero a efectos prácticos es mejor aprender con alguien que te enseñe.
Saludos y gracias otra vez.

Etiquetas: funcion, objeto, plantilla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:15.