使用用户定义的操作隐式转换为类型



我想对类中的类型使用用户定义的运算符:

class TWithUserDefinedOp
{
private: int a{42};
public: operator *(const TWithUserDefinedOp& other) { return a * other.a;}
};
class Wrap 
{
private: TWithUserDefinedOp a;
public: operator TWithUserDefinedOp() const { return a; }
}

现在,当我想多个Wrap类时,我希望它可以工作

Wrap a, b;
auto mul = a * b; //Error: Wrap does not define this operator or a conversion to a type acceptable to the predefined operator

现在,如果我更改包装以容纳整数类型:

 class WrapIntegral 
 {
 private: int a{42};
 public: operator int() const { return a; }
 }

乘法现在有效。

WrapIntergal a,b;
auto mulInt = a * b; // this works ok

我在其他类似的问题中读到,C++只允许 1 级隐式转换。如果我计数正确,第一个示例中只有一个隐式转换。从定义operator *WrapTWithUserDefinedOp。我的误解是什么,或者我在这里做错了什么?

op* 具有以下签名:TWithUserDefinedOp

operator* (const TWithUserDefinedOp& other(。 与 Wrap 类相同。

这意味着第一个转换是(Wrap -> TWithUserDefinedOp(,第二个转换是(TWithUserDefinedOp -> Wrap(。

原始代码的可能修复:

#include <iostream>
#include <typeinfo>
using namespace std;
class TWithUserDefinedOp
{
private:
    int a{ 42 };
public:
    TWithUserDefinedOp(int a_ = 1) : a(a_) {}
    friend TWithUserDefinedOp operator* (const TWithUserDefinedOp& a, const TWithUserDefinedOp& b);
};
TWithUserDefinedOp operator* (const TWithUserDefinedOp& a, const TWithUserDefinedOp& b)
{
    return TWithUserDefinedOp(a.a * b.a);
}
class Wrap
{
private:
    TWithUserDefinedOp a;
public:
    Wrap(const TWithUserDefinedOp& a_ = TWithUserDefinedOp()) : a(a_) {}
    operator TWithUserDefinedOp() const
    {
        return a;
    }
};
int main()
{
    Wrap a, b;    
    auto c = a * b;
    cout << typeid(c).name() << "n";   // TWithUserDefinedOp
    Wrap d = a * b;
    return 0;
}

我认为问题是您需要从类类型转换为积分类型,这是乘法运算符的预定义类型。在你的第一个例子中,你没有它。

相关内容

  • 没有找到相关文章

最新更新