Следующий код выдает ожидаемую ошибку компилятора (Демо):
1 template struct Range;
2
3 template > struct Unique;
4 template struct Unique 1)> > { typedef char type[1]; };
5 template struct Unique 2)> > { typedef char type[2]; };
6
7 Unique<3>::type o1;
8 Unique<3>::type o2;
Теперь, если я поменяю местами строку-5 и строку-7. Тогда НЕТ ошибки компилятора !! Демо.
5 Unique<3>::type o1;
7 template struct Unique 2)> > { typedef char type[2]; };
Для o1
понятно, что ошибки нет, потому что специализация для (значение > 2)
еще не видна. Но почему нет ошибки и для o2
, который видит 2 совпадающие специализации !?
Я предполагаю, что компилятор должен выбрать Unique::type
с каким-то произвольным именем, когда он встречается в первый раз, а затем заменить Unique::type
везде с этим именем.
Это ошибка компиляции, или ошибка C++, или C++ "feature" ?