Код ниже - это фрагмент кода, над которым я работаю. В идеале пользователь библиотеки может частично указать тип Fixed, предполагая, что он хочет использовать одно и то же целое число поддержки и точность во всем своем коде (значения FixedBase сопоставимы только в том случае, если у них одинаковая поддержка value_t).
Удивительно, но это не компилируется. Создание экземпляра в main выбирает первый шаблон, а затем терпит неудачу, потому что 11 не является типом ... несмотря на наличие допустимой специализации.
#include <cstdint>
/******** Library code *********/
template<typename value_t, std::size_t MAX_PREC>
class FixedBase {};
template<typename value_t, std::size_t MAX_PREC, int L, int R>
class Fixed : public FixedBase<value_t, MAX_PREC> {};
/********* User code **********/
// User specialization
template<int L, int R>
class Fixed<int64_t, 64, L, R> {};
int main(void) {
Fixed<11, -3> a;
return 0;
}
Главный вопрос: почему он выбирает первую специализацию и терпит неудачу, а не выбирает действительную вторую специализацию? Как заставить компилятор выбрать правильный?
Второй вопрос: есть ли лучший способ частично указать параметры шаблона? Я думаю, что может быть какой-то особый синтаксис using, с которым я не знаком и не нашел во время поиска в Google.





Вы неправильно поняли, как работает специализация, специализация не меняет список параметров шаблона.
В этом случае вы можете использовать псевдоним:
template<int L, int R>
using my_type = Fixed<int64_t, 64, L, R>;
int main(void) {
my_type<11, -3> a;
return 0;
}
Когда вы добавляете частичную специализацию, например
template<int L, int R>
class Fixed<int64_t, 64, L, R> {};
Вы не создали шаблон для Fixed, который просто позволяет вам указывать L и R, как вы это делаете в Fixed<11, -3> a;. Вы сказали компилятору, что если он увидит
Fixed<int64_t, 64, some_int, some_other_int>
тогда он должен использовать специализацию, поскольку первые два параметра совпадают.
Короче говоря: вы всегда должны указывать всех основных членов шаблона.
Это именно тот синтаксис, который я искал. Не могли бы вы пояснить, что вы имеете в виду под «специализацией не меняет список параметров шаблона».