2010-04-01 19 views
5

que tiene una clase comoC++ explícita especialización de plantilla de constructor de plantilla de clase de plantilla

template <class T> 
struct A{ 
    template <class U> 
    A(U u); 
}; 

me gustaría escribir una especialización explícita de este para una declaración como

A<int>::A(float); 

En la siguiente prueba código, si comento la especialización, compila con g ++. De lo contrario, se dice que tengo un número incorrecto de los parámetros de plantilla:

#include <iostream> 

template <class T> 
struct A{ 
    template <class U> 
    A(T t, U *u){ 
     *u += U(t); 
    } 
}; 

template <> 
template <> 
A<int>::A<int,float>(int t, float *u){ 
    *u += float(2*t); 
} 

int main(){ 
    float f = 0; 
    int i = 1; 
    A<int>(i, &f); 
    std::cout << f << std::endl; 
    return 0; 
} 
+1

Por cierto, haga el parámetro 'U & u' en lugar de un puntero. Es más seguro y más fácil. – GManNickG

Respuesta

4

Trate

template <> 
template <> 
A<int>::A(int t, float *u){ 
    *u += float(2*t); 
} 

que parece funcionar para mí.

+0

Vaya, tengo un error tipográfico allí; la U debería estar flotante, déjame arreglar eso. –

+0

Ok, parece que funciona, pero se basa en especificar los parámetros implícitamente. ¿Es esta la única manera de hacerlo? –

+0

Esto también es lo que funciona en VC++ 2008. – conio

1

La lista de parámetros de función de la definición debe coincidir con la declaración.

template <> 
template <> 
A<int>::A<float>(int t, float *u){ 
    *u += U(2*t); 
} 
+0

con 'U' reemplazado con float, esto se compila con Comeau, pero no se compila con gcc – smerlin

+1

Encontré http://gcc.gnu.org/bugzilla/show_bug.cgi?id=9050. El problema es específico de los constructores. – Potatoswatter

Cuestiones relacionadas