我已经为需要执行的某些计算开发了模板库。现在,我需要将其与Ceres结合使用,并且希望能够使用automatic derivaties工具。对此的要求是所使用的函数和类需要进行模板化,以便Ceres可以使用其ceres::Jet<T,n>
类型。我已经能够开发功能,并使用它们和ceres解决最小化问题。但是,我的库(由大量的函数和类组成)具有一些功能,例如(请注意,这是一个简化的示例,其产生的错误与我在我的库中使用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));
}
我还试图通过阅读implicit conversion和user-defined conversions来理解我的问题,但是我不理解如何在示例中使用该信息。
我的问题是:
非常感谢您。