Ho una funzione modello variadic che si chiama per determinare il numero più grande in un elenco (costituito dagli argomenti templatizzati). Sto cercando di fare una specializzazione per quando il pacchetto di parametri è vuoto, quindi posso solo restituire il numero in cima all'elenco, ma non so come farlo. Sono solo familiarizzare con i modelli variadic e il modello di specializzazione, ma questo è quello che ho finora:Specializzazione di modelli per un pacchetto di parametri vuoto
#include <string>
#include <iostream>
using namespace std;
template <int N, int... N2>
int tmax() {
return N > tmax<N2...>() ? N : tmax<N2...>();
}
template <int N>
int tmax() {
return N;
}
int main() {
cout << tmax<32, 43, 54, 12, 23, 34>();
}
Tuttavia, questo produce il seguente errore:
test.cpp: In function ‘int tmax() [with int N = 34, int ...N2 = {}]’:
test.cpp:9:45: instantiated from ‘int tmax() [with int N = 23, int ...N2 = {34}]’
test.cpp:9:45: instantiated from ‘int tmax() [with int N = 12, int ...N2 = {23, 34}]’
test.cpp:9:45: instantiated from ‘int tmax() [with int N = 54, int ...N2 = {12, 23, 34}]’
test.cpp:9:45: instantiated from ‘int tmax() [with int N = 43, int ...N2 = {54, 12, 23, 34}]’
test.cpp:9:45: instantiated from ‘int tmax() [with int N = 32, int ...N2 = {43, 54, 12, 23, 34}]’
test.cpp:18:39: instantiated from here
test.cpp:9:45: error: no matching function for call to ‘tmax()’
test.cpp:9:45: error: no matching function for call to ‘tmax()’
Ho anche provato questo, basta per vedere se avrebbe funzionato (anche se introduce il numero 0 alla lista in modo casuale in modo che non potrà mai restituire un numero minore di 0):
template <int N, int... N2>
int tmax() {
return N > tmax<N2...>() ? N : tmax<N2...>();
}
template <>
int tmax<>() {
return 0;
}
Tuttavia, in aggiunta agli errori di cui sopra, ottengo questo errore:
error: template-id ‘tmax<>’ for ‘int tmax()’ does not match any template declaration
Così che cosa devo fare per ottenere questo lavoro?
Sto usando g ++ 4.5.2 con il flag -std=c++0x
.
Ottimale, grazie. –
La necessità di "dividere" in modo esplicito i parametri pack in modo head/tail mi ha già morso un bel po 'di volte, mi aspetto che ci abitueremo ad esso ... tuttavia non penso che mettere il caso base prima sia obbligatorio , come è, di solito li metto subito dopo. –