Неоднозначная перегрузка для оператора C ++ - PullRequest
0 голосов
/ 14 февраля 2020
#include <iostream>
using namespace std;

class StringNum {
public:
    string s;
    StringNum() {s = "";}
public:
    StringNum(int n) {
        for (int i=1; i<=n; i++) s += "x";

    }

    operator int () {
        return s.length();
    }

    StringNum operator - (StringNum v) {
        int len = s.length() - v.s.length();
        StringNum res;
        for (int i=1;i<=len;i++) res.s += "x";
        return res;
    }

    /* // long solution. But this will allow the program to run.
    template <class T>
    StringNum operator - (T value) {
        return (*this) - StringNum(value);
    }
    */
};

int main()
{
    StringNum x(4);
    cout << 3 - x; // this compiles
    cout << x - 3; // error: ambiguous overload for operator - 
                   // change the program so that the 2nd line output 2
    return 0;
}

Итак, у меня есть класс, который может быть преобразован с int / downcast до int (это упрощенная версия, в реальной версии StringNum - HighPrecisionFloat, а int - int / float / double / ... Et c).

Когда я компилирую программу, появляется сообщение об ошибке

In function 'int main()':|
error: ambiguous overload for 'operator-' (operand types are 'StringNum' and 'int')|
note: candidate: operator-(int, int) <built-in>|
note: candidate: StringNum StringNum::operator-(StringNum)|

Это происходит потому, что есть два способа понять x - 3:

a) int(x) - 3
b) x - StringNum(3)

Один из способов сделать это - использовать шаблон для каждого оператора (+, -, *, /, точка продукта и т. Д. c ...) Но это не очень удобно, потому что мне приходится писать шаблоны для каждого оператора.

Есть ли лучшее решение этой проблемы? Я sh позвоню x - StringNum(3). Спасибо.

1 Ответ

1 голос
/ 14 февраля 2020

Вы можете сделать свой конструктор и преобразовать его в int explicit.

Компилятор больше не будет выполнять неявное преобразование между этими типами, но вы все равно можете использовать их следующим образом.

auto stringNum = StringNum{3}; //int to StringNum
int y = static_cast<int>(stringNum);
...