2009-11-26 17 views
8

Considere el siguiente código:No puedo obtener acceso al puntero al miembro. ¿Por qué?

template<class T, class F>   struct X {}; 
template<class T, class F, T F::* m> struct Y {}; 

struct Foo { 
    int member; 
    typedef X<int, Foo>    x_type; // works well 
    typedef Y<int, Foo, &Foo::member> y_type; // ERROR 
}; 

typedef Y<int, Foo, &Foo::member> y_type2; // OK 

¿Por qué generan error del compilador? (VS2008)


Nueva

he publicado este error a connect.microsoft.com.

+1

Qué compilador está usando? No hay errores con g ++ 4.3.3. – sth

+0

¿Cuál es el error devuelto por el compilador? – luc

+2

No puedo entender la declaración de la plantilla "Y". Los parámetros de la plantilla son tipos o valores integrales. "TF :: * m" no es un tipo, con el que puede parametrizar su plantilla ... Cuando escribe "Y ", el último parámetro no es un tipo y no un valor integral. Es un puntero al miembro. Entonces, creo, debe ser rechazado ... – SadSido

Respuesta

1

Ésta es una bug

+1

Eso es lo que dije (http://stackoverflow.com/questions/1802204/i-can-not-get-access-to-pointer-to-member-why/1802365#1802365) –

7

Creo que está relacionado de alguna manera con que Visual C++ no conoce el tamaño del puntero al miembro en ese punto. Compruebe this informe de defectos, por ejemplo (here es otro problema con el puntero a la variable miembro). Creo que encontraste un error más de Visual C++ y debería informarse a connect.microsoft.com.

+0

Coincido con la teoría de 'errores'. Me encontré con el mismo problema últimamente, y encontré, pero no recuerdo dónde, que aún no eran "totalmente compatibles" con los argumentos de la clase de plantilla de puntero a miembro. – xtofl

+0

Sin embargo, el compilador no necesita saber _size_, imho. – xtofl

+0

Quiero decir que 'sizeof (& Foo :: member)' podría ser 1 o más dependiendo de la declaración 'Foo'. –

0

Me encontré con el mismo problema. El soporte para argumentos de plantilla de puntero a miembro aún es limitado en VC++ (consulte bug report).

En mi caso podría solucionarlo utilizando una función de plantilla i.s.o. una clase de plantilla:

template< typename Class > struct CMemberDumper { 
    Class& object; 
    template< typename M > void visit_member(M C::*pm) { 
     std::cout << object.*pm; 
    } 
}; 
+3

Su error no está relacionado con mi problema. Funciona bien sin ningún error de compilación. Yo uso VS2008. –

Cuestiones relacionadas