2010-04-01 18 views
5

Ho una classe comeC++ esplicito modello di specializzazione del costruttore su modelli di classe su modelli

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

vorrei scrivere una specializzazione esplicita di questo per una dichiarazione come

A<int>::A(float); 

Nel seguente test codice, se commento la specializzazione, compila con g ++. In caso contrario, si dice che ho sbagliato numero di parametri del modello:

#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

A proposito, impostare il parametro 'U & u' anziché un puntatore. È più sicuro e più facile. – GManNickG

risposta

4

Prova

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

che sembra funzionare per me.

+0

Oops, ho un errore di battitura lì; la U dovrebbe essere fluttuante, lascia che ti aggiusti. –

+0

Ok, sembra funzionare, ma si basa sulla specificazione implicita dei parametri. È questo l'unico modo per farlo? –

+0

Questo è anche ciò che funziona su VC++ 2008. – conio

1

L'elenco dei parametri delle funzioni della definizione deve corrispondere a quello della dichiarazione.

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

con 'U' sostituito da float, questo si compila con Comeau, ma non si compila con gcc – smerlin

+1

Ho trovato http://gcc.gnu.org/bugzilla/show_bug.cgi?id=9050. Il problema è specifico per i costruttori. – Potatoswatter

Problemi correlati