Я пытаюсь создать небольшой класс-оболочку вокруг std :: vector, чтобы представить коэффициенты многочлена. Вызывающий должен иметь возможность выполнять итерацию через коэффициенты, но я не хочу раскрывать основную реализацию.Компилятор не может «преобразовать» между Vector_const_iterator и Vector_iterator, хотя методы для обоих доступны
Используя шаблон описал here, here, и в других местах, я попытался пройти по итераторы, как показано ниже:
typedef std::vector<unsigned char> charVec;
class gf255_poly
{
public:
// Constructors and Polynomial-y Functions
// ...
// Iterators to go from high to low degree
charVec::const_reverse_iterator h2l_begin() const { return p.rbegin(); };
charVec::const_reverse_iterator h2l_end() const { return p.rend(); };
charVec::reverse_iterator h2l_begin() { return p.rbegin(); };
charVec::reverse_iterator h2l_end() { return p.rend(); };
// Iterators to go from low to high degree
charVec::const_iterator l2h_begin() const { return p.begin(); };
charVec::const_iterator l2h_end() const { return p.end(); };
charVec::iterator l2h_begin() { return p.begin(); };
charVec::iterator l2h_end() { return p.end(); };
protected:
std::vector<unsigned char> p;
};
Эти gf255_poly объекты затем привыкают в таких методов, как это:
// Performs polynomial evaluation in GF(2^8)
unsigned char gf255_poly_eval(const gf255_poly &poly, unsigned char x) const
{
unsigned char fx = poly.coefHigh(); // Initialize with coef of highest degree term
// Use Horner's method with consecutively factored terms:
// x^3 + 2x^2 + 3x + 4 -> (((1x + 2)x + 3)x + 4)
charVec::reverse_iterator next_coef;
for (next_coef = poly.h2l_begin(); next_coef != poly.h2l_end(); next_coef++)
fx = gf255_mul(fx, x)^*next_coef; // Recall^is addition in GF 2^8
return fx;
}
Простой, хотя кажется, что что-то не так с типами. Visual Studio дает мне эту ошибку на линии с для цикла, который я не могу разобраться:
error C2664: 'std::_Revranit<_RanIt,_Base>::_Revranit(_RanIt)' : cannot convert parameter 1 from 'std::_Vector_const_iterator<_Ty,_Alloc>' to 'std::_Vector_iterator<_Ty,_Alloc>'
Я не понимаю, это сообщение - я предоставил методы, которые возвращают как итераторы и const_iterators. Почему компилятор не может выбирать между ними?
Неявные в этом вопросе, является ли это хорошая стратегия для сокрытия деталей от вызывающей вообще (так как они по-прежнему приходится иметь дело с этими StD :: типов векторных), и я был бы признателен за ответы, также обратитесь к этому.
К сожалению, C++ 11 ISN» t в настоящее время вариант. Весь магазин dev живет в надежде на обновление до VS, но нет никаких признаков того, что это произойдет. Тем не менее, спасибо за тщательный ответ и больше боеприпасов, чтобы продвигать новые функции! – Bear