Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: bash en 13 Febrero 2016, 13:32 pm



Título: template en function [codigo]
Publicado por: bash en 13 Febrero 2016, 13:32 pm
Saludo a todos !!

Con el proposito de aprender estructura de datos estoy haciendo una clase para tener una especie de lista enlazadas , estoy usando template y como todos sabemos los templates se deben definir dentro del mismo header(c++98) entonces le cuento tengo una estructura llamado nodo que esta basada en plantilla y tiene de variables , un puntero al nodo siguiente y el dato a almacenar en esa instancia, luego tengo la clase lista que tiene el nodo a la cabeza de node y tengo una funcion que me devuelve un nodo
el problema me lo da al compilar

es el siguiente :
../src/LinkList.h:66:50: error: invalid cast from type ‘Object’ to type ‘void*’
         head_traits = (T) createNode((void *)data);


me gustaira saber si hay perdidas de datos cuando forzo a compilar  con static_cast<void *> , el codigo solo compilar si uso eso si no :D es otra cosa. dejare  el codigo...
Código
  1.  
  2.  
  3. #define DEBUG 1
  4.  
  5. Node_traits<void*>* createNode(void *cr_dat)
  6. {
  7.  
  8. #ifdef DEBUG
  9.    clog << "__FUNCTION__"<<__FUNCTION__<<endl;
  10. #endif
  11.  
  12. Node_traits<void*> *ret = new Node_traits<void*>();
  13.    memcpy(ret->data, cr_dat, sizeof(cr_dat));
  14.    ret->next_ptr_traits = NULL;
  15.    return ret;
  16. }
  17.  
  18.  
  19.  
  20. template<class T>
  21. struct Link_List
  22. {
  23. int cnt;
  24.    Node_traits<T> *head_traits;
  25.  
  26.  
  27.    void CreateList(T data)
  28.    {
  29.        head_traits = (T) createNode((void *)data);
  30.    }
  31.  
  32.  
  33.  
  34. };
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  

gracias de antemano.!!


Título: Re: template en function [codigo]
Publicado por: Stakewinner00 en 13 Febrero 2016, 14:15 pm
creo que tendría que ser con el puntero a data, es decir.
Código:
head_traits = (T) createNode((void *)&data);
con static_cast<void*> tambié dará el mismo error
Código
  1. class Objeto {
  2. };
  3.  
  4. int main() {
  5.  Objeto a;
  6.  void* x = (void*)&a;
  7.  void* y = static_cast<void*>(&a);
  8.  
  9.  void* xx = (void*)a; //Invalid cast from Objeto to void*
  10.  void* yy = static_cast<void*>(a); //Invalid static_cast from Objeto to void*
  11. }
con los casts de C++ como static_cast no fuerzas nada, solo muestras explícitamente el tipo de cast que estas haciendo para que sea más legible

A modo de aclaración, del libro de "The C++ Programming language de Stroustrup sobre los "C-style cast"
Citar
From C, C++ inherited the notation(T)e, which performs any conversion that can be expressed as a
combination ofstatic_casts,reinterpret_casts,const_casts to make a value of typeT from the
expressione(§44.2.3). Unfortunately, the C-style cast can also cast from a pointer to a class to a
pointer to a private base of that class. Never do that, and hope for a warning from the compiler if
you do it by mistake. This C-style cast is far more dangerous than the named conversion operators
because the notation is harder to spot in a large program and the kind of conversion intended by the
programmer is not explicit. That is,(T)e might be doing a portable conversion between related
types, a nonportable conversion between unrelated types, or removing theconstmodif i er from a
pointer type. Without knowing the exact types ofTande, you cannot tell.