1

모두 방법을 사용할 수있는 경우에도, 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; 
} 

단순 유형으로 잘못되어 가고 뭔가가있다. 나는 두 반복자를 돌려주는 방법을 제공 한 -이 메시지를 이해하지 못하는

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>' 

: 비주얼 스튜디오 나에게 내가 밖으로 퍼즐 수가 없습니다 for 루프와 라인에이 오류를 제공합니다 const_iterators. 왜 컴파일러는 그것들을 선택할 수 없습니까? 이 질문에 암시


이가 (그들은 여전히 ​​이러한 표준 : : 벡터 형식을 처리해야하기 때문에) 전혀 발신자의 상세 정보를 숨기기위한 좋은 전략인지, 그리고 내가 대답을 감사하겠습니다 그 또한이 문제를 해결하십시오.

답변

1
charVec::reverse_iterator next_coef = poly.h2l_begin(); 

next_coefreverse_iterator이다. h2l_begin()는 무엇을 반환합니까?

const gf255_poly &poly 

const gf255_poly :

음, poly는 것입니다. 그래서 우리가 h2l_begin()의 우선 살펴 보자 :

charVec::const_reverse_iterator h2l_begin() const { return p.rbegin(); }; 
charVec::reverse_iterator  h2l_begin() { return p.rbegin(); }; 

두 개의 오버로드가 있습니다. 만 polyconst 때문에 하나가 유효하며, 그이 하나입니다

charVec::const_reverse_iterator h2l_begin() const { return p.rbegin(); }; 

그래서 poly.h2l_begin()charVec::const_reverse_iterator을 반환합니다. charVec::const_reverse_iterator 당신이 일을 통해 반복되고 수정할 수 있기 때문에 charVec::reverse_iterator하지 않는 동안

charVec::const_reverse_iterator는, charVec::reverse_iterator로 변환 할 수 없습니다.

즉, polyconst이므로 수정하지 않기로했습니다. 그런 다음 그것을 수정할 수있는 유형을 사용하여 반복했습니다. 그래서 당신은 타입 에러를 얻습니다.

둘째

및 제쳐두고 컴파일러 절대 반환형에 기초하여 기능 중에서 선택하지 (틀림 변환 operator T() 제외) 참고. 비 const polyconst_reverse_iterator에 저장 한 경우에도 reverse_iterator h2l_begin()으로 전화 할 수 있습니다. reverse_iteratorconst_reverse_iterator으로 변환됩니다.


먼저해야 할 일은 C++ 11로 업그레이드하는 것입니다. 이것은 내가 반복자의 범위를 저장하고 조건부 beginend 등을 노출하는 range_t<Iterator>을 써서, 2016 년

두 번째입니다 (등 Iteratoroperator[]의 랜덤 액세스 네스, size, 또한 remove_front(size_t)front()에 기초하여

그럼 I은 T* C::data() 방법으로 용기로부터 암시 ctors, 원료 C 어레이와 함께 연속 T*, size_t T S의 범위를 나타내는 array_view<T>:range_it<T*>을 써서 empty와 ....

마지막으로 backwards_tbackwards 함수를 작성하면 range_t<Iterator>이되고 range_t< reverse_iterator<Iterator> >을 반환합니다.

이제 내 gf255_poly이있다 : 우리가 선택하는 경우에 우리는 반복자에 대한 형식 정의를 노출 할 수 있습니다

backwards_t< array_view< unsigned char > > h2l(); 
backwards_t< array_view< unsigned char const > > h2l() const; 
array_view< unsigned char > l2h(); 
array_view< unsigned char const > l2h() const; 

(그리고 C++ 03에서 우리는 선택의 여지가). 좋은이다

for (auto&& next_coef = poly.h2l()) 
    fx = gf255_mul(fx, x)^next_coef; // Recall^is addition in GF 2^8 

: 같은

는 C++ 11에서는 보입니다.

charVec::reverse_iterator next_coef; 

이것 :이

+0

, C++ (11) ISN을 ' 현재 옵션입니다. 전체 데브샵은 VS 로의 업그레이드를 희망하며 살고 있지만 실제 일어날 것이라는 징후는 없습니다. 그럼에도 불구하고 철저한 답변과 새로운 기능을 추가로 탄약에 감사드립니다! – Bear

1

poly은 const 개체이므로 h2l_begin()은 const_reverse_iterator를 반환합니다. 당신은 reverse_iteratornext_coef을 선언 한, 당신은 반복자에 const를 반복자를 할당 할 수 없습니다. next_coefconst_reverse_iterator으로 변경하거나 for 루프에서 auto로 선언하십시오.

for (auto next_coef = poly.h2l_begin(); next_coef != poly.h2l_end(); ++next_coef) 
0

변경

charVec::const_reverse_iterator next_coef; 

당신은 참조하십시오 polygf255_poly 객체에 const 참조, 즉의 const 자격을 갖춘 버전을 선호 poly.h2l_begin();에 대한 요청을 의미 기능 과부하 해결 중. 당신은 여전히 ​​루프 초기화에 대한 외부의 반복자를 유지해야하는 경우

더 나은 아직, auto

for (auto 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 

를 사용하면 외부 intitialization를 이동할 수 있습니다 : 불행하게도

auto next_coef = poly.h2l_begin() 
for (; next_coef != poly.h2l_end(); next_coef++) 
    fx = gf255_mul(fx, x)^*next_coef; // Recall^is addition in GF 2^8 
관련 문제