Я разработал шаблонную библиотеку для некоторых вычислений, которые мне нужно сделать. Теперь мне нужно использовать его в сочетании с Ceres , и я хочу иметь возможность использовать инструмент автоматический производный . Для этого необходимо, чтобы используемые функции и классы были шаблонными, чтобы Ceres мог использовать тип ceres::Jet<T,n>
. Я был в состоянии разработать функции и использовать их и прежде всего для решения проблемы минимизации. Тем не менее, моя библиотека (которая состоит из большого количества функций и классов) имеет некоторые функции, такие как (пожалуйста, обратите внимание, что это упрощенный пример, который выдает ту же ошибку, что и тот, который у меня есть с ceres::Jet<T,n>
в моей библиотеке):
template <typename T>
void func()
{
T a = 2;
}
Я создал небольшую структуру, которая эмулирует структуру cres::Jet<T,N>
(в этом примере struct
имеет те же конструкторы, что и ceres::Jet<T,N>
):
template <typename T, int N>
struct A
{
enum
{
DIMENSION = N
};
A()
{
}
explicit A(const T& value)
{
}
A(const T& value, int k)
{
}
};
Всякий раз, когда я делаю func<A<double,2>>()
(или любые T
и N
), я получаю следующую ошибку:
error: no viable conversion from 'int' to 'A<double, 2>'
T a = 2;
^ ~
Я знаю, что могу изменить T a = 2
на T a = T(2)
, и это будет работать. Однако я не хочу менять это в каждом месте моей библиотеки (это займет много времени), если T a = 2
- это действительно глупая вещь, которую я не должен делать. Я пытался добавить конструкторы или operator=
безуспешно (operator=
даже не компилируется):
template <typename M>
A(const M& a)
{
}
template <typename M>
A& operator=(const M& other)
{
return A<T, N>(T(other));
}
Я также пытался понять мою проблему, читая неявное преобразование и пользовательские преобразования , но я не понимаю, как использовать эту информацию в моем примере.
Мои вопросы:
- Есть ли способ, которым я могу сделать это, добавив некоторое определение в класс?
- Есть ли способ, которым я могу сделать это без добавления некоторого определения в классе?
Большое спасибо.