Qual è la ragione per la seconda parentesi <> nel seguente modello di funzione:Funzione formato del modello di specializzazione
template<> void doh::operator()<>(int i)
Ciò è avvenuto in SO question in cui è stato suggerito che ci sono parentesi mancanti dopo operator()
, però ho potuto non trovare la spiegazione.
ho capito il significato, se si trattava di un tipo di specializzazione (pieno di specializzazione) del modulo:
template< typename A > struct AA {};
template<> struct AA<int> {}; // hope this is correct, specialize for int
Tuttavia per i modelli di funzione:
template< typename A > void f(A);
template< typename A > void f(A*); // overload of the above for pointers
template<> void f<int>(int); // full specialization for int
Da dove viene questo rientrano in questa scenarion ?:
template<> void doh::operator()<>(bool b) {}
Esempio di codice che sembra funzionare e non fornisce alcun wa rnings/errore (gcc 3.3.3 utilizzato):
#include <iostream>
using namespace std;
struct doh
{
void operator()(bool b)
{
cout << "operator()(bool b)" << endl;
}
template< typename T > void operator()(T t)
{
cout << "template <typename T> void operator()(T t)" << endl;
}
};
// note can't specialize inline, have to declare outside of the class body
template<> void doh::operator()(int i)
{
cout << "template <> void operator()(int i)" << endl;
}
template<> void doh::operator()(bool b)
{
cout << "template <> void operator()(bool b)" << endl;
}
int main()
{
doh d;
int i;
bool b;
d(b);
d(i);
}
uscita:
operator()(bool b)
template <> void operator()(int i)
la sintassi precedente della doppia parentesi è molto dispari. Normalmente ho visto l'operatore (bool b), ma come funziona operator() (bool b)? A cosa serve il primo empty()? – Jimm
@Jimm il nome del metodo è 'operator()' e prende un parametro 'bool b' ... è l'operatore di chiamata di funzione. Vedi 'main' nel mio esempio di codice,' d (b) ' – stefanB