簡體   English   中英

隱式用戶定義的轉換不起作用,因為在編譯C ++時無法識別運算符和轉換構造函數

[英]Implicit user defined conversion not working because operator and conversion constructor are unrecognized when compiling C++

我已包含用於復制此問題的最少代碼。

我希望將Furlong對象分配給Metric對象,反之亦然,但是編譯器卻給我這個錯誤:

沒有運算符“ =”匹配這些操作數

頭文件:

#ifndef DISTANCE_H_
#define DISTANCE_H_

using namespace std;
#include <iostream>

//const to facilitate conversions between the two classes

const double FEET_IN_METERS = 0.3048;
const double FURLONG_TO_FEET = 660;

class Furlong;
class Metric;

class Furlong {
public:

    Furlong(int fur = 0, int yar = 0, int fee = 0.0);

    // Copy Constructor.

    Furlong( const Furlong& rhs );

    // Destructor.

    ~Furlong(void);

    // Assignment operator=.
    Furlong&    operator=( Furlong& rhs);

    int furlong;
    int yards;
    double feet;

};

class Metric {

public:
Metric(int kilo = 0, double mete = 0.0);

Metric (const Metric& rhs);

~Metric(void);

Metric& operator=(Metric& rhs);

Metric (Furlong& f);

operator Furlong();

int kilometers;
double meters;
};

#endif

類定義文件:

#include <stdlib.h>
#include "Distances.h"

//FURLONG CLASS DEFINITIONS

//Constructor

Furlong::Furlong(int fur, int yar, int fee) {
    furlong = fur;
    yards = yar;
    feet = fee;
}

// Copy Constructor.

Furlong::Furlong( const Furlong& rhs ) {
    furlong = rhs.furlong;
    yards = rhs.yards;
    feet = rhs.feet;
}

    // Destructor.

Furlong::~Furlong(void) {

}

    // Assignment operator=.

Furlong& Furlong::operator=( Furlong& rhs) {

    furlong = rhs.furlong;
    yards = rhs.yards;
    feet = rhs.feet;

    return *this;

}
//METRIC CLASS DEFINITONS


Metric::Metric(int kilo, double mete) {
    kilometers = kilo;
    meters = mete;
}
Metric::Metric(const Metric& rhs) {

    kilometers = rhs.kilometers;
    meters     = rhs. meters;
}

Metric::~Metric(void) {

}

Metric& Metric::operator=(Metric& rhs) {
    kilometers = rhs.kilometers;
    meters     = rhs.meters;

    return *this;
}

// conversion constructor

Metric::Metric (Furlong& f) {
 kilometers = 3;
 meters = 2.0;
}

//conversion operator

Metric::operator Furlong() {
    return Furlong(1, 2, 3.0);
}

主文件:

#include <stdlib.h>
#include "Distances.h"


using namespace std;

int main() {
    Furlong one(1,2,3.0); 
    Furlong three(4,5,6.0);
    Metric two(7,8.0);
    Metric four(9, 10.0);

    one = two;
    four = three;

    return 0;
}

我希望將對象2轉換為Furlong類型,然后分配給對象1。 此外,對象3應該轉換為Metric類型,然后分配給對象4

您只需要使轉換顯式,以便編譯器找到路徑:

one =  (Furlong) two;
four = (Metric) three;

信不信由你,這個問題僅僅是缺乏const正確性。

class Furlong
{
public:
    // ...

    // Assignment operator=.
    Furlong&    operator=( Furlong& rhs);

    // ...    
};

class Metric 
{

public:
    // ...

    Metric& operator=(Metric& rhs);

    // ...
};

當你嘗試給一個FurlongMetric ,這里發生了什么:

  1. 沒有Metric::operator=()使用Furlong或使用[cv] Furlong&
  2. 編譯器確定是否可以進行隱式轉換。 在這種情況下,您提供了可以使用的構造函數Metric (Furlong& f)
  3. 編譯器調用此構造函數,創建一個臨時Metric ,然后將其用於調用Metric& Metric::operator=(Metric&)
  4. 由於Metric::operator=()的參數不是const ,並且不接受右值引用,因此它無法綁定到臨時對象。 由於沒有其他潛在的轉換可用,因此編譯器會發出錯誤。

同樣,當嘗試向Furlong分配MetricMetric::operator Furlong()用於創建臨時Furlong ,但是Furlong::operator=()無法接受臨時變量作為參數,因此無法進行轉換。


因此,解決方案很簡單:由於operator=()都不修改rhs ,因此我們將其作為const引用。

class Furlong
{
public:
    // ...

    // Assignment operator=.
    Furlong&    operator=(const Furlong& rhs);

    // ...    
};

class Metric 
{

public:
    // ...

    Metric& operator=(const Metric& rhs);

    // ...
};

Furlong& Furlong::operator=(const Furlong& rhs)
{
    // ...
}

Metric& Metric::operator=(const Metric& rhs)
{
    // ...
}

這允許rhs綁定到臨時對象,如Furlong所產生Metric::operator Furlong()Metric通過產生Metric(Furlong&) 該代碼將成功編譯

暫無
暫無

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

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