Considere el siguiente programa:plantilla de tipo constante operador de conversión no funciona bajo Linux (gcc)
#include <iostream>
template<int s>
class Pack
{
public:
Pack(){}
char data[s];
template<typename X> operator X&(){ return *reinterpret_cast<X*>(data); }
template<typename X> operator X const&()const{ return *reinterpret_cast<const X*>(data); }
};
int main()
{
const Pack<8> p;
const double d(p);
std::cout<<d<<std::endl;
}
Se compila bien en Windows. bajo Linux me sale:
test.cc: In function ‘int main()’:
test.cc:17: error: passing ‘const Pack<8>’ as ‘this’ argument of ‘Pack<s>::operator X&() [with X = double, int s = 8]’ discards qualifiers
¿Por qué? ¿Por qué no está tomando el operador de conversión de tipo const? ¿Cómo puedo solucionar esto y todavía tengo el operador de conversión de tipo de plantilla conveniente (en const y no const versión). Gracias!
Tengo un error diferente con GCC (y Comeau). No encuentra ninguna función de conversión. Probablemente porque está buscando una función de conversión como 'operator double()' y no encuentra una adecuada (porque las proporcionadas también tienen una referencia). - Si es una buena idea en primer lugar, ¿por qué no utilizar una función de miembro con nombre? – UncleBens
@UncleBens, estás en lo correcto, mira a continuación. –
No quiero usar el operador double(), porque la clase Pack debe poderse convertir a cualquier tipo. El ejemplo que publiqué se quitó para demostrar el problema. – Nathan