C++ 用户定义的转换不能使用C++;
我正在尝试用Eigen解决一些问题。在这个过程中,我发现static\u cast和用户定义转换冲突,可能是std::enable\u if引起的问题 以下是我尝试的基本内容:C++ 用户定义的转换不能使用C++;,c++,type-conversion,enable-if,C++,Type Conversion,Enable If,我正在尝试用Eigen解决一些问题。在这个过程中,我发现static\u cast和用户定义转换冲突,可能是std::enable\u if引起的问题 以下是我尝试的基本内容: #include <Eigen/Dense> #include <bits/stdc++.h> using namespace std; class Vector2 { public: operator Eigen::Vector2d () { retur
#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;
}
这似乎是启用\u的问题,如果启用,我想知道为什么静态\u cast不起作用。有没有一种方法可以解决这个问题而不修改特征值?现在可以这样做:
void Extend(Vector2 a)
{
Eigen::Vector2d b = a;
data.extend( b );
}
但是太难看了
这似乎是启用\u的问题,如果
,我想知道为什么静态\u cast
没有
工作
这与static\u cast
本身无关。生成错误的原因是Vector2
的运算符本征::Vector2d()
未为常量对象定义,并且由于您的Box2::Extend()
采用常量Vector2&a
,因此未为代码中的该行定义适当的强制转换。将Vector2
的用户定义强制转换的const
版本添加到Eigen::Vector2d
中,以使其编译并保留代码:
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;
}
这似乎是启用\u的问题,如果
,我想知道为什么静态\u cast
没有
工作
这与static\u cast
本身无关。生成错误的原因是Vector2
的运算符本征::Vector2d()
未为常量对象定义,并且由于您的Box2::Extend()
采用常量Vector2&a
,因此未为代码中的该行定义适当的强制转换。将Vector2
的用户定义强制转换的const
版本添加到Eigen::Vector2d
中,以使其编译并保留代码:
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;
}
@多谢各位怀疑论者!我按照你的解决方案解决了它。C++编译错误日志经常误导我。还要感谢这里的其他人。@sfire请注意,经过再三考虑,我进行了编辑,以明确正确的解决方案是添加另一个版本的casting操作符,而不是只更改现有的一个。好的,我知道。感谢您提供有关常量正确性的信息。@怀疑论专家谢谢!我按照你的解决方案解决了它。C++编译错误日志经常误导我。还要感谢这里的其他人。@sfire请注意,经过再三考虑,我进行了编辑,以明确正确的解决方案是添加另一个版本的casting操作符,而不是只更改现有的一个。好的,我知道。感谢您提供有关const正确性的信息。