Tengo una función de plantilla variadic que se llama a sí misma para determinar el número más grande en una lista (constituido por los argumentos de plantilla). Estoy tratando de hacer una especialización para cuando el paquete de parámetros está vacío, así que puedo devolver el número al principio de la lista, pero no sé cómo hacerlo. Estoy familiarizarse con las plantillas variadic y especialización de plantilla, pero esto es lo que tengo hasta ahora:Especialización de plantilla para un paquete de parámetros vacío
#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>();
}
Sin embargo, esto produce el siguiente error:
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()’
También he probado esto, sólo para ver si iba a funcionar (si bien introduce el número 0 a la lista de forma aleatoria por lo que no puede nunca volver un número inferior a 0):
template <int N, int... N2>
int tmax() {
return N > tmax<N2...>() ? N : tmax<N2...>();
}
template <>
int tmax<>() {
return 0;
}
sin embargo, Además a los errores mencionados anteriormente, me sale este error:
error: template-id ‘tmax<>’ for ‘int tmax()’ does not match any template declaration
Entonces, ¿qué debo hacer para conseguir este trabajo?
Estoy usando g ++ 4.5.2 con la bandera -std=c++0x
.
Optimal, gracias. –
La necesidad de "dividir" explícitamente el paquete de parámetros de una manera cabeza/cola ya me ha mordido un montón de veces, espero que nos acostumbremos ... sin embargo, no creo que poner el caso base primero sea obligatorio , como es, generalmente los pongo inmediatamente después. –