У меня нет моей копии стандарта под рукой, поэтому не уверен, что это настоящая проблема или старый компилятор.

я есть функция шаблона variadic, которая вызывает себя для определения наибольшего числа в списке (составленного из шаблонизированных аргументов). Я пытаюсь сделать специализацию для случая, когда пакет параметров пуст, поэтому я могу просто вернуть число в начале списка, но я не знаю, как это сделать. Я только знакомлюсь с вариадическими шаблонами и специализацией шаблонов, но это то, что я имею до сих пор:

#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>();
}

Однако это приводит к следующей ошибке:

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()’

Я также попробовал это, просто чтобы посмотреть, сработает ли это (хотя он вводит число 0 в список случайным образом, чтобы он никогда не мог вернуть число меньше 0):

template <int N, int... N2>
int tmax() {
    return N > tmax<N2...>() ? N : tmax<N2...>();
}

template <>
int tmax<>() {
    return 0;
}

Тем не мение,к тому же к ошибкам, упомянутым выше, я получаю эту ошибку:

error: template-id ‘tmax<>’ for ‘int tmax(),’ does not match any template declaration

Так что я должен сделать, чтобы это работало?

Я использую G ++ 4.5.2 с-std=c++0x флаг.

Ответы на вопрос(2)

Ваш ответ на вопрос