Sto tentando di implementare una funzione di modello con le maniglie vuote in modo diverso utilizzando la specializzazione del modello.per funzioni membro statiche; come?
Il seguente codice mi dà una "specializzazione esplicita in ambito non-spazio dei nomi" in gcc:
template <typename T>
static T safeGuiCall(boost::function<T()> _f)
{
if (_f.empty())
throw GuiException("Function pointer empty");
{
ThreadGuard g;
T ret = _f();
return ret;
}
}
// template specialization for functions wit no return value
template <>
static void safeGuiCall<void>(boost::function<void()> _f)
{
if (_f.empty())
throw GuiException("Function pointer empty");
{
ThreadGuard g;
_f();
}
}
ho provato a spostare fuori della classe (la classe non è templato) e nello spazio dei nomi, ma quindi viene visualizzato l'errore "La specializzazione esplicita non può avere una classe di archiviazione". Ho letto molte discussioni a riguardo, ma le persone non sembrano concordare su come specializzare i modelli di funzione. Qualche idea?
hm Ho provato la stessa cosa adesso, ma l'ho messo in un file .hpp e ho provato ad includerlo ... poi ho ricevuto l'errore "definizione multipla di vodi X: ff (Test ). Non riesco a vedere cosa sarebbe –
Rolle
È stato un errore del compilatore o del linker?Se si tratta di un errore del compilatore, significa che probabilmente si include l'intestazione del modello più di una volta e mancano le protezioni dell'intestazione, e quindi la doppia definizione: il compilatore sta visualizzando due (ahimè esattamente esatte) definizioni per l'implementazione. –
Perché devo aggiungere in linea per il primo caso? In caso contrario, sto ricevendo un errore di compilazione. – sop