Я думаю, что обоснование этой ошибки связано с тем, что аргументы по умолчанию в шаблоне функции также применимы к его специализации, и вам не разрешено определять аргумент по умолчанию более одного раза в C ++.
Обратите внимание на следующее:
#include <iostream>
template<class T> void f(T t = 'a') {}
template<> void f<char>(char c)
{
std::cout << c << std::endl;
}
int main(int argc, char **argv)
{
f<char>();
}
Будет напечатано a
, означающее, что специализация вызывается с аргументом по умолчанию, определенным в основном шаблоне.
Если вам нужен другой аргумент по умолчанию для каждой специализации, вы можете использовать подход, показанный ниже:
#include <iostream>
template<class T>
struct default_arg
{
static T get() { return T(); }
};
template<class T> void f(T t = default_arg<T>::get()) {}
template<>
struct default_arg<char>
{
static char get() { return 'a'; }
};
template<> void f<char>(char c)
{
std::cout << c << std::endl;
}
int main(int argc, char **argv)
{
f<char>();
}