2017-06-29 11 views
1

Windowsでnghttp2、opensourceをコンパイルしようとしています。私は既にLinuxで同じことをうまくコンパイルしました。Visual Studioのstd :: beginとend :: endイテレータ

次のコードからコンパイルエラーが発生しています。 *

template <size_t N> struct Memchunk { 
public: 
    Memchunk(Memchunk *next_chunk) 
     : pos(std::begin(buf)), last(pos), knext(next_chunk), next(nullptr) {} 
    size_t len() const { return last - pos; } 
    size_t left() const { return std::end(buf) - (const size_t) last; } 
    void reset() { pos = last = std::begin(buf); } 
    std::array<uint8_t, N> buf; 
    uint8_t *pos, *last; 
    Memchunk *knext; 
    Memchunk *next; 
    static const size_t size = N; 
}; 

*

私は、次のエラーを取得しています。

error C2440: 'return': cannot convert from'std::_Array_const_iterator<_Ty,16384>' to 'std::size_t' 

私はLinuxで前述のエラーに直面しませんでした。私はVisual Studioに固有のものを見逃していますか?

+3

非常に悪いC++コードのように見えます。 – Stargateur

+0

gccはどちらも気に入らないhttp://ideone.com/SJNXbJ。どのコンパイラがこれを受け入れますか?エラーは私には意味がある。 – Persixty

+3

どうして 'std :: array :: iterator pos、last;'?理解できません。 – ZDF

答えて

0

この問題は、std::begin()から、ポインタ をLinux上に返し、適切なイテレータをウィンドウに返すことに起因する可能性があります。これに加えていくつかのバグ。

あなたはこのように、クラスに便利な機能としてbeginendを追加する場合:

その後 left()
template <size_t N> struct Memchunk { 
    uint8_t* begin() { return buf.data(); } 
    uint8_t* end() { return buf.data()+N; } 
    const uint8_t* begin() const { return buf.data(); } 
    const uint8_t* end() const { return buf.data()+N; } 
    // rest not shown 
}; 

は次のように実装できます。おそらく

size_t left() const { return end() - last; } 

キャストで警告を沈黙させる

posメンバーをbegin()で初期化できますember初期化リスト

+0

私は実際の問題に関連する小さなプログラムを書いていますが、これはLinuxではコンパイルできますが、Visual Studioではコンパイルできません。 '#include using namespace std; int foo(std :: array &a) { 符号なしint * b = a.begin(); return a.end()-b; } int main(void){ std :: array a = {1,2,3,4}; foo(a); } 'Visual Studioで次のエラーが発生しました。 ' エラーC2678バイナリ' - ':タイプ' std :: _ Array_iterator <_Ty,10> 'の左辺オペランドを取る演算子が見つかりませんでした(または受け入れ可能な変換はありません) 'アイデーンリンク[リンク](http://ideone.com/a23Lzq) –

関連する問題