使用用户定义的操作隐式转换为类型
Implicit conversion to type with user defined operation
我想对 class 中的类型使用用户定义的运算符:
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
class 时,我希望它能工作
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 级隐式转换。如果我没记错的话,第一个例子中只有一个隐式转换。从 Wrap
到 TWithUserDefinedOp
定义了 operator *
。我的误解是什么或者我在这里做错了什么?
我认为问题在于您需要将 class 类型转换为整数类型,这是乘法运算符的预定义类型。在你的第一个例子中你没有它。
op* 具有签名:TWithUserDefinedOp operator* (const TWithUserDefinedOp& other)。换行 class.
相同
这意味着第一个转换是 (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;
}
我想对 class 中的类型使用用户定义的运算符:
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
class 时,我希望它能工作
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 级隐式转换。如果我没记错的话,第一个例子中只有一个隐式转换。从 Wrap
到 TWithUserDefinedOp
定义了 operator *
。我的误解是什么或者我在这里做错了什么?
我认为问题在于您需要将 class 类型转换为整数类型,这是乘法运算符的预定义类型。在你的第一个例子中你没有它。
op* 具有签名:TWithUserDefinedOp operator* (const TWithUserDefinedOp& other)。换行 class.
相同这意味着第一个转换是 (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;
}