簡體   English   中英

使用用戶定義的操作隱式轉換為類型

[英]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類時,我希望它能夠工作

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到定義了operator *TWithUserDefinedOp 我有什么誤解或我在這里做錯了什么?

我認為問題在於您需要將 class 類型轉換為 Integral 類型,這是乘法運算符的預定義類型。 在您的第一個示例中,您沒有它。

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM