运算符重载中的类型转换错误

时间:2013-11-04 17:28:11

标签: c++ operator-overloading

我有一个模板类,我需要重载operator ==。我这样做是按照以下方式进行的

template <typename T>
class Polynomial {
    vector<T> coefficients;

    public:
    Polynomial(vector<T> c);

    bool operator ==(const Polynomial& second) const {
            const typename vector<T>::iterator thisBegin = this->coefficients.begin();
            const typename vector<T>::iterator secondBegin = second.coefficients.begin();
            for ( ; ((thisBegin != this->coefficients.end()) &&
                                    (secondBegin != second.coefficients.end()));
                            ++thisBegin, ++secondBegin) {
                    if (*thisBegin != *secondBegin)
                            return false;
            }
            while (thisBegin != this->coefficients.end()) {
                    if (*thisBegin != 0)
                            return false;
                    ++thisBegin;
            }
            while (secondBegin != second.coefficients.end()) {
                    if (*secondBegin != 0)
                            return false;
                    ++secondBegin;
            }
            return true;
    }
};

但是,当我使用T = int创建此类的两个对象并尝试应用此运算符

Polynomial<int> first(firstVector);
Polynomial<int> second(secondVector);
std::cout << (first == second) << std::endl;

我收到了错误

problem2.cpp: In instantiation of ‘bool Polynomial<T>::operator==(const Polynomial<T>&)    const [with T = int; Polynomial<T> = Polynomial<int>]’:
problem2.cpp:63:32:   required from here
problem2.cpp:23:83: error: conversion from ‘std::vector<int, std::allocator<int> >::const_iterator {aka __gnu_cxx::__normal_iterator<const int*, std::vector<int, std::allocator<int> > >}’ to non-scalar type ‘std::vector<int, std::allocator<int> >::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >}’ requested

有人可以指出这次转换有什么问题吗?谢谢!

2 个答案:

答案 0 :(得分:3)

您正在尝试将const_iterator转换为iterator

const typename vector<T>::iterator thisBegin = this->coefficients.begin();
在此上下文中,

thisconst,因此this->coefficients.begin();会返回const_iterator。试试这个:

typename vector<T>::const_iterator thisBegin = this->coefficients.begin();

另请注意,thisBegin不是const,如您的示例所示。这是因为你做了这样的事情:

++secondBegin;

要求const_iterator为非const(意味着你可以修改迭代器,但不能修改它指向的东西)。

答案 1 :(得分:1)

  • 您的方法为const,表示您只能在const
  • 上调用this个函数
  • 您将const引用传递给方法,因此您只能在其上调用const个函数

所以,两者

 this->coefficients.begin();
 second.coefficients.begin()

返回const迭代器。

您无法将其分配给非const个。

有一个解决方案:

vector<T>::const_iterator& thisBegin = this->coefficients.begin();
vector<T>::const_iterator& secondBegin = second.coefficients.begin();

(使用对const_iterator的引用)

更好:

auto& thisBegin = this->coefficients.begin();
auto& secondBegin = second.coefficients.begin();

(使用对auto的引用,C ++ 11特性)

顺便说一下,您可以使用std::mismatch

简单地比较两个向量