EDITED (Оригинальный вопрос имел только int A, int B):
Вывод аргумента шаблона работает, как и ожидалось, когда #arguments, сравниваемые между специализациями, одинаков, но завершается ошибкой, когда они отличаются (из-за включения параметров по умолчанию, включенных водна из специализаций).
Например: почему вычет аргумента шаблона не срабатывает в одном случае по сравнению с другим, может ли кто-то указать на какие-либо ресурсы / стандарты, где это объясняется?
// Example program
#include <iostream>
template <int A, int B, int C, int D=1>
class Foo;
template <int A, int B, int C>
class Foo <A, B, C>
{
public:
int a;
Foo()
{
a = 0;
}
};
template <int D> // Fails compilation
class Foo <1, 1, 1, D> // Fails compilation
//template <> // works, prints a = 1
//class Foo <1, 1, 1> // works, prints a = 1
{
public:
int a;
Foo()
{
a = 1;
}
};
int main()
{
Foo <1, 1, 1, 1> f;
std::cout << "a = "<< f.a << std::endl;
}
ошибка: неоднозначная реализация шаблона для класса 'Foo <1, 1, 1, 1>'