[英]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);
// ...
};
當你嘗試給一個Furlong
到Metric
,這里發生了什么:
Metric::operator=()
使用Furlong
或使用[cv] Furlong&
。 Metric (Furlong& f)
。 Metric
,然后將其用於調用Metric& Metric::operator=(Metric&)
。 Metric::operator=()
的參數不是const
,並且不接受右值引用,因此它無法綁定到臨時對象。 由於沒有其他潛在的轉換可用,因此編譯器會發出錯誤。 同樣,當嘗試向Furlong
分配Metric
, Metric::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.