C++ стандартный раздел 8.3.6.4 говорит, чтоПочему аргумент по умолчанию нельзя добавить позже в функциях шаблона?
Для функций, не шаблонных, аргументы по умолчанию могут быть добавлены в более поздние декларации функции в той же области. [...]
Но мой вопрос в том, почему он не допускается для функций шаблона? В чем причина не допускать добавления аргументов по умолчанию в более поздние объявления в той же области для функций шаблона?
Рассмотрите эту программу, которая компилируется в порядке. (Не шаблон функции) (см видеодемонстрацию here.)
#include <iostream>
int f(int a,int b,int c=3);
int f(int a,int b=9,int c); // default argument in middle, ok allowed
int main()
{
f(3);
f(3,6);
f(3,6,9);
return 0;
}
int f(int a,int b,int c)
{
std::cout<<a<<' '<<b<<' '<<c<<'\n';
return 0;
}
Но после проваливается в компиляции. (Шаблон функции) (см демо here.)
#include <iostream>
template <typename T>
void f(T a,int b,int c=3);
template <typename T>
void f(T a,int b=9,int c); // compiler error why???
int main()
{
f(3);
f(3,6);
f(3,6,9);
return 0;
}
template <typename T>
void f(T a,int b,int c)
{
std::cout<<a<<' '<<b<<' '<<c<<'\n';
}
Отсутствует 'template'? –
LogicStuff
Не так ли * добавление * и более * переопределение * аргументов по умолчанию? – jaggedSpire
[Здесь] (http://coliru.stacked-crooked.com/a/39117b9aa49c90a4) пример почти компиляции – jaggedSpire