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;
    }
};

ただし、このクラスの 2 つのオブジェクトを 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

を に変換しようとしconst_iteratorていiteratorます:

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が非 const である必要があります (つまり、反復子を変更できますが、それが指すものは変更できません)。

于 2013-11-04T17:30:05.103 に答える