У меня есть следующая ошибка:
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;
Я верю, что в заголовке вопроса есть ответ: используйте explicit
ключевое слово в операторе преобразования типов.
Подробнее здесь: http://www.parashift.com/c++-faq/explicit-ctors.html
Но вам нужен С++ 11. Подробнее здесь: Может ли оператор трансляции быть явным?
explicit
для операторов приведения является новая функция C ++ 11. Даже я должен был найти это, чтобы быть уверенным. C ++ - это огромный язык, а C ++ 11 - еще больше.
std::vector<int> toVector() const
? Таким образом, не наследуются операторы дляclass PerformObj
изclass PerformObj
std::vector<int>
.