Как требовать явного приведения

0

У меня есть следующая ошибка:

error: use of overloaded operator '+' is ambiguous (with operand types 'InObj' and 'class PerformObj')

Причина в том, что я предоставил vector<int> оператор преобразования vector<int> для PerformObj чтобы результаты можно было сохранить в векторе. Однако проблема заключается в том, что InObj ожидает vector<int> с правой стороны, он неявно преобразует PerformObj, вызывая проблему. Я хотел бы иметь его так, чтобы PerformObj можно было явно передать в vector<int> (плюс добавленные знаки для удобочитаемости).

x is an integer
nums is a vector<int>
cube is a lambda
((x + in + nums) + perform + cube)
 ^inobj            ^ implicitly converted to vector<int>
^performobj

Как вы можете видеть, PerformObj принимает InObj как параметр левой стороны, но добавление оператора преобразования вызывает неоднозначность.

В идеале мне бы хотелось что-то вроде этого:

std::vector<int> results = static_cast<vector<int>>(x in num perform cube);

Для справки, вот код:

InObj& operator+(InObj& lhs, const std::vector<int>& rhs) {
    lhs.rhs = rhs;
    return lhs;
} 

class PerformObj {
public:
    // snip
    operator std::vector<int>() const {
        std::vector<int> temp;
        for (int i = 0; i < lhs.rhs.size(); i++) {
            temp.push_back(rhs(lhs.rhs[i]));
        }
        return temp;
    }
    friend std::ostream& operator<<(std::ostream& os, const PerformObj& po);
} performobj;

PerformObj& operator+(const InObj& lhs, PerformObj& rhs) {
    rhs.lhs = lhs;
    return rhs;
}

// Error occurs on the following line
std::cout << x in nums perform cube << std::endl;
  • 0
    я считаю, что операторы приведения являются злыми, вы получаете случайные побочные эффекты, такие как наследование операторов от типа класса вашего оператора приведения. почему бы не предоставить метод std::vector<int> toVector() const ? Таким образом, не наследуются операторы для class PerformObj из class PerformObj std::vector<int> .
  • 0
    Приведение всегда явно: это то, что вы пишете в своем исходном коде, чтобы сказать компилятору выполнить преобразование .
Теги:
type-conversion
operator-overloading

1 ответ

2
Лучший ответ

Я верю, что в заголовке вопроса есть ответ: используйте explicit ключевое слово в операторе преобразования типов.

Подробнее здесь: http://www.parashift.com/c++-faq/explicit-ctors.html

Но вам нужен С++ 11. Подробнее здесь: Может ли оператор трансляции быть явным?

  • 0
    Вау, я чувствую себя действительно очень глупо
  • 0
    Не чувствуй себя глупым explicit для операторов приведения является новая функция C ++ 11. Даже я должен был найти это, чтобы быть уверенным. C ++ - это огромный язык, а C ++ 11 - еще больше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню