C++ 用户定义的转换不能使用C++;

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

我正在尝试用Eigen解决一些问题。在这个过程中,我发现static\u cast用户定义转换冲突,可能是std::enable\u 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;   
}
这似乎是启用\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正确性的信息。