template en function [codigo]

Iniciado por bash, 13 Febrero 2016, 13:32 PM

0 Miembros y 1 Visitante están viendo este tema.

bash

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 (cpp) [Seleccionar]



#define DEBUG 1

Node_traits<void*>* createNode(void *cr_dat)
{

#ifdef DEBUG
    clog << "__FUNCTION__"<<__FUNCTION__<<endl;
#endif

Node_traits<void*> *ret = new Node_traits<void*>();
    memcpy(ret->data, cr_dat, sizeof(cr_dat));
    ret->next_ptr_traits = NULL;
    return ret;
}



template<class T>
struct Link_List
{
int cnt;
    Node_traits<T> *head_traits;


    void CreateList(T data)
    {
        head_traits = (T) createNode((void *)data);
    }



};











gracias de antemano.!!
gracias por responder mis dudas

Stakewinner00

#1
creo que tendría que ser con el puntero a data, es decir.
head_traits = (T) createNode((void *)&data);

con static_cast<void*> tambié dará el mismo error
Código (cpp) [Seleccionar]
class Objeto {
};
 
int main() {
 Objeto a;
 void* x = (void*)&a;
 void* y = static_cast<void*>(&a);
 
  void* xx = (void*)a; //Invalid cast from Objeto to void*
  void* yy = static_cast<void*>(a); //Invalid static_cast from Objeto to void*
}

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"
CitarFrom 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.