1

我有一个模板类,我需要重载运算符 ==。我通过以下方式做到这一点

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

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

4

2 回答 2

3

您正在尝试将 a 转换const_iteratoriterator

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

thisconst在这种情况下,所以this->coefficients.begin();返回 a const_iterator。尝试这个:

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

另请注意,这thisBegin不是const,如您的示例所示。这是因为您随后会执行以下操作:

++secondBegin;

这要求const_iterator是非常量的(这意味着您可以修改迭代器,但不能修改它指向的东西)。

于 2013-11-04T17:30:05.103 回答
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();

(使用对autoC++11 特性的引用)

顺便说一句,您可以使用简单地比较两个向量std::mismatch

于 2013-11-04T17:38:16.090 回答