2009-03-14 12 views
7

Considere el siguiente códigoCómo escribir una plantilla std :: bitset que funciona en 32 y 64 bits

template<unsigned int N> void foo(std::bitset<N> bs) 
{ /* whatever */ } 

int main() 
{ 
    bitset<8> bar; 
    foo(bar); 
    return 0; 
} 

g ++ se queja de esto en 64 bits porque el < 8> consigue interpretarse como un entero largo sin signo , que no coincide exactamente con la plantilla. Si cambio la plantilla para decir unsigned long int, entonces las compilaciones de 32 bits se quejan.

Obviamente, una manera de solucionar este problema es cambiar bitset < 8> a BitSet < 8ul>, pero ¿hay alguna manera de volver a escribir la plantilla parte por lo que va a trabajar con lo que la interpretación por defecto de un valor numérico literal es?

Respuesta

7

El problema no es si escribe o no 8u o 8. El problema tiene que ver con el tipo del parámetro de plantilla de su plantilla de función. Su tipo debe coincidir con el utilizado en la declaración de std::bitset. Eso es size_t de acuerdo con el (la sección 23.3.5) Estándar

namespace std { 
    template<size_t N> class bitset { 
    public: 
    // bit reference: 
     ... 

La excepción son dimensiones de la matriz, para lo cual se puede utilizar cualquier tipo entero (incluso bool - a continuación, el único tamaño que puede ser aceptado es 1 por supuesto):

// better size_t (non-negative), but other types work too 
template<int N> void f(char(&)[N]); 

Pero en otras ocasiones, los tipos tienen que coincidir. Tenga en cuenta que esto solo es cierto para los argumentos de plantilla autodetectados, pero no para los explícitamente dados. La razón es que, para los deducidos, el compilador intenta encontrar la mejor coincidencia entre los argumentos de la plantilla real y lo que dedujo de la llamada a la misma. Muchas conversiones implícitas no están permitidas. Usted tiene toda la gama de conversiones disponibles si se pone el argumento explícito (ignorando la solución de utilizar size_t ahora para hacer mi punto)

template<int N> void foo(std::bitset<N> bs) 
{ /* whatever */ } 

int main() { 
    bitset<8> bar; 
    foo<8>(bar); // no deduction, but full range of conversions 
} 
0

un literal numérico debe interpretarse como un int sin importar la plataforma

+0

aún más el problema es que no puedo hacerlo plantilla porque entonces el Bitset se queja de que su argumento debe ser unsigned int –

3

Uso size_t. Así dice el MSDN al menos.

Cuestiones relacionadas