Пользовательский класс присваивается типам примитивов - PullRequest
0 голосов
/ 13 сентября 2018

Я разработал шаблонную библиотеку для некоторых вычислений, которые мне нужно сделать. Теперь мне нужно использовать его в сочетании с 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));
}

Я также пытался понять мою проблему, читая неявное преобразование и пользовательские преобразования , но я не понимаю, как использовать эту информацию в моем примере.

Мои вопросы:

  1. Есть ли способ, которым я могу сделать это, добавив некоторое определение в класс?
  2. Есть ли способ, которым я могу сделать это без добавления некоторого определения в классе?

Большое спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...