用户定义的转换不能在 C++ 中使用 static_cast
user-defined conversion cannot use static_cast in C++
我正在尝试用 Eigen 解决一些问题。过程中发现static_cast和用户自定义转换冲突,可能是std导致的问题::enable_if?
这基本上是我尝试过的:
#include <Eigen/Dense>
#include <bits/stdc++.h>
using namespace std;
class Vector2
{
public:
operator Eigen::Vector2d ()
{
return data;
}
private:
Eigen::Vector2d data;
};
class Box2
{
public:
void Extend(const Vector2 & a)
{
data.extend( static_cast<Eigen::Vector2d>(a) ); // error, but why?
}
private:
Eigen::AlignedBox2d data;
};
int main()
{
Vector2 a;
Eigen::Vector2d b = a; // ok, implicit conversion
return 0;
}
g++ -std=c++11
输出了很多错误日志,这是最后一部分:
eigen/eigen/Eigen/src/Core/PlainObjectBase.h:863:30: note: template argument deduction/substitution failed:
eigen/eigen/Eigen/src/Core/PlainObjectBase.h: In substitution of ‘template<class T> void Eigen::PlainObjectBase<Derived>::_init1(const Index&, typename Eigen::internal::enable_if<((((((! Eigen::internal::is_same<long int, typename Eigen::internal::traits<T>::Scalar>::value) && Eigen::internal::is_same<long int, T>::value) && (typename Eigen::internal::dense_xpr_base<Derived>::type:: SizeAtCompileTime != Eigen::Dynamic)) && (typename Eigen::internal::dense_xpr_base<Derived>::type:: SizeAtCompileTime != 1)) && Eigen::internal::is_convertible<T, typename Eigen::internal::traits<T>::Scalar>::value) && Eigen::internal::is_same<typename Eigen::internal::traits<T>::XprKind, Eigen::ArrayXpr>::value), T*>::type*) [with T = T; Derived = Eigen::Matrix<double, 2, 1>] [with T = Vector2]’:
eigen/eigen/Eigen/src/Core/Matrix.h:296:33: required from ‘Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::Matrix(const T&) [with T = Vector2; _Scalar = double; int _Rows = 2; int _Cols = 1; int _Options = 0; int _MaxRows = 2; int _MaxCols = 1]’
test.cpp:21:52: required from here
eigen/eigen/Eigen/src/Core/PlainObjectBase.h:863:30: error: invalid use of incomplete type ‘struct Eigen::internal::enable_if<false, Vector2*>’
In file included from eigen/eigen/Eigen/Core:364:0,
from eigen/eigen/Eigen/Dense:1,
from eigen/eigen/Eigen/Eigen:1,
from test.cpp:2:
eigen/eigen/Eigen/src/Core/util/Meta.h:162:50: error: declaration of ‘struct Eigen::internal::enable_if<false, Vector2*>’
template<bool Condition, typename T=void> struct enable_if;
^
好像是enable_if的问题,不知道为什么static_cast不行。有没有办法在不修改Eigen的情况下解决这个问题?现在可以这样做了:
void Extend(Vector2 a)
{
Eigen::Vector2d b = a;
data.extend( b );
}
但是太丑了
It seems like the issue of enable_if
, I wonder why static_cast
doesn't
work.
这与static_cast
本身无关。产生错误的原因是 Vector2
的 operator Eigen::Vector2d ()
没有为 const
对象定义,并且由于您的 Box2::Extend()
采用 const Vector2& a
,因此没有进行适当的转换为代码中的那一行定义。将 Vector2
的 用户定义的转换 添加到 Eigen::Vector2d
的 const
版本,使其既可以编译又可以保留 const-correctness代码:
const operator Eigen::Vector2d () const
{
return data;
}
现在用法如您所愿:
int main()
{
Vector2 a;
Eigen::Vector2d b = a; // ok, implicit conversion
Box2 boxy;
boxy.Extend(a); // also ok, implicit conversion inside, from a const&
return 0;
}
我正在尝试用 Eigen 解决一些问题。过程中发现static_cast和用户自定义转换冲突,可能是std导致的问题::enable_if?
这基本上是我尝试过的:
#include <Eigen/Dense>
#include <bits/stdc++.h>
using namespace std;
class Vector2
{
public:
operator Eigen::Vector2d ()
{
return data;
}
private:
Eigen::Vector2d data;
};
class Box2
{
public:
void Extend(const Vector2 & a)
{
data.extend( static_cast<Eigen::Vector2d>(a) ); // error, but why?
}
private:
Eigen::AlignedBox2d data;
};
int main()
{
Vector2 a;
Eigen::Vector2d b = a; // ok, implicit conversion
return 0;
}
g++ -std=c++11
输出了很多错误日志,这是最后一部分:
eigen/eigen/Eigen/src/Core/PlainObjectBase.h:863:30: note: template argument deduction/substitution failed:
eigen/eigen/Eigen/src/Core/PlainObjectBase.h: In substitution of ‘template<class T> void Eigen::PlainObjectBase<Derived>::_init1(const Index&, typename Eigen::internal::enable_if<((((((! Eigen::internal::is_same<long int, typename Eigen::internal::traits<T>::Scalar>::value) && Eigen::internal::is_same<long int, T>::value) && (typename Eigen::internal::dense_xpr_base<Derived>::type:: SizeAtCompileTime != Eigen::Dynamic)) && (typename Eigen::internal::dense_xpr_base<Derived>::type:: SizeAtCompileTime != 1)) && Eigen::internal::is_convertible<T, typename Eigen::internal::traits<T>::Scalar>::value) && Eigen::internal::is_same<typename Eigen::internal::traits<T>::XprKind, Eigen::ArrayXpr>::value), T*>::type*) [with T = T; Derived = Eigen::Matrix<double, 2, 1>] [with T = Vector2]’:
eigen/eigen/Eigen/src/Core/Matrix.h:296:33: required from ‘Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::Matrix(const T&) [with T = Vector2; _Scalar = double; int _Rows = 2; int _Cols = 1; int _Options = 0; int _MaxRows = 2; int _MaxCols = 1]’
test.cpp:21:52: required from here
eigen/eigen/Eigen/src/Core/PlainObjectBase.h:863:30: error: invalid use of incomplete type ‘struct Eigen::internal::enable_if<false, Vector2*>’
In file included from eigen/eigen/Eigen/Core:364:0,
from eigen/eigen/Eigen/Dense:1,
from eigen/eigen/Eigen/Eigen:1,
from test.cpp:2:
eigen/eigen/Eigen/src/Core/util/Meta.h:162:50: error: declaration of ‘struct Eigen::internal::enable_if<false, Vector2*>’
template<bool Condition, typename T=void> struct enable_if;
^
好像是enable_if的问题,不知道为什么static_cast不行。有没有办法在不修改Eigen的情况下解决这个问题?现在可以这样做了:
void Extend(Vector2 a)
{
Eigen::Vector2d b = a;
data.extend( b );
}
但是太丑了
It seems like the issue of
enable_if
, I wonder whystatic_cast
doesn't work.
这与static_cast
本身无关。产生错误的原因是 Vector2
的 operator Eigen::Vector2d ()
没有为 const
对象定义,并且由于您的 Box2::Extend()
采用 const Vector2& a
,因此没有进行适当的转换为代码中的那一行定义。将 Vector2
的 用户定义的转换 添加到 Eigen::Vector2d
的 const
版本,使其既可以编译又可以保留 const-correctness代码:
const operator Eigen::Vector2d () const
{
return data;
}
现在用法如您所愿:
int main()
{
Vector2 a;
Eigen::Vector2d b = a; // ok, implicit conversion
Box2 boxy;
boxy.Extend(a); // also ok, implicit conversion inside, from a const&
return 0;
}