Ho difficoltà a definire e specializzare una funzione membro update()
di una classe interna Outer<T1>::Inner
che è basata su un argomento non di tipo (enum).Definizione di un modello di funzione membro della classe interna con un argomento enum (non di tipo)
#include <cstdlib>
template<typename T1>
struct Outer
{
struct Inner
{
enum Type{ A , B , C };
template<Type T2>
void update();
};
};
// Definition
template<typename T1>
template<Outer<T1>::Inner::Type T2>
void Outer<T1>::Inner::update()
{
}
// Specialization
template<typename T1>
template<Outer<T1>::Inner::A >
void Outer<T1>::Inner::update()
{
}
int main()
{
return EXIT_SUCCESS;
}
sto ottenendo il seguente messaggio di errore nel GCC 4.5.3
prog.cpp:17:28: error: ‘Outer::Inner::Type’ is not a type
prog.cpp:18:6: error: prototype for ‘void Outer<T1>::Inner::update()’ does not match any in class ‘Outer<T1>::Inner’
prog.cpp:11:15: error: candidate is: template<class T1> template<Outer<T1>::Inner::Type T2> void Outer<T1>::Inner::update()
prog.cpp:24:28: error: ‘Outer::Inner::A’ is not a type
prog.cpp:25:6: error: prototype for ‘void Outer<T1>::Inner::update()’ does not match any in class ‘Outer<T1>::Inner’
prog.cpp:11:15: error: candidate is: template<class T1> template<Outer<T1>::Inner::Type T2> void Outer<T1>::Inner::update()
BTW, a differenza di GCC, Visual Studio 2008 è in grado di compilare il seguente
template<typename T1>
struct Outer
{
struct Inner
{
enum Type{ A , B , C };
template<Type T2>
struct Deep;
};
};
template<typename T1>
template<typename Outer<T1>::Inner::Type T2>
struct Outer<T1>::Inner::Deep
{
};
Devo ammettere questo generato uno dei messaggi di errore più umoristici di VC2012 che ho visto in un istante: 'errore C2244: 'Esterno :: Interno :: aggiornamento': impossibile associare la definizione di funzione a una dichiarazione esistente, definizione 'void Outer :: Inner :: update (void)', dichiarazioni esistenti: 'void Esterno :: Inner :: update (void)' 'La notevole differenza tra le dichiarazioni esistenti e quelle desiderate è così ovvia, non è = P –
WhozCraig
Stavo per segnalare che Visual Studio 2008 non approva. C'è una soluzione? In realtà sto codificando in VS. Uso GCC per i controlli di conformità sanitaria. – Olumide
@Olumide sarà sufficiente un controllo di runtime per ciò che stai facendo? Molto probabilmente il compilatore ottimizzerà il controllo e il codice morto perché sa che sarà sempre vero o falso. –