Как правильно получить конкретный тип данных Type с помощью другого типа T в качестве шаблонного аргумента? Я написал следующий код, но он не компилируется:
```cpp
template <typename T>
struct param_type_trait<int> {
using Type = TYPE_A;
};
template <typename T>
struct param_type_trait<float> {
using Type = TYPE_B;
};
template <class T>
void registrate_param(...) {
auto param = new_shared<param_type_trait<T>::Type>();
...
}
```
Компилятор GCC выдает ошибку "template parameters not deducible in partial specialization". Подскажите, как исправить эту ошибку и сделать код работоспособным.
Ошибка "template parameters not deducible in partial specialization" означает, что компилятор не может вывести или установить значение шаблонного параметра `T` в частичной специализации шаблона. В вашем коде у вас есть ошибки в определении шаблонов `param_type_trait`. Вместо `int` и `float` в качестве шаблонного параметра необходимо использовать `T`.
Вот исправленный код:
```cpp
template <typename T>
struct param_type_trait {
using Type = TYPE_A; // если T - int
};
template <>
struct param_type_trait<float> {
using Type = TYPE_B;
};
template <class T>
void registrate_param() {
using ParamType = typename param_type_trait<T>::Type;
auto param = new ParamType();
// ...
}
```
Теперь шаблоны `param_type_trait` корректно определены, и код должен компилироваться без ошибок.
В функции `registrate_param` мы использовали `using` для определения псевдонима `ParamType`, который равен типу `Type` из `param_type_trait<T>`. Затем мы создаем экземпляр `ParamType`, используя оператор `new`.
Обратите внимание, что я также удалил `...` в определении функции `registrate_param`. Если у вас есть какие-то другие аргументы для этой функции, вы можете добавить их в определение.
Во-первых, есть if constexpr, во-вторых std::enable_if
template <class T> void registrate_param() { if constexpr (std::is_same_v<T, int>) auto param = make_shared<int>(); else if (std::is_same_v<T, float>) auto param = make_shared<double>(); }
Ты можешь указать тип на прямую в шаблоне
template<int T> void Test();