2016-11-22 16 views
0

現在、カスタムベクトルクラスで角括弧のオーバーロードに問題があります。大括弧のオーバーロード=>演算子がオペランドと一致しません

私のクラスは基本的に次のようになります。

typedef uint32_t u32; // This is not actually here, but so you get the idea. Also, it is included in the problematic call's file 

template<class T> 
class JFFVector 
{ 
public: 
    //Init and stuff 
    T& operator[](u32 iIndex) 
    { 
     return m_pData[iIndex + miDataOffset]; 
    } 

private: 
    T* m_pData; 
    u32 m_iDataOffset; 
} 

そして、このクラスの機能の中に、私は(* this)を呼び出すことができます[0]、すべてが動作します。 今私がいる問題は、次のようにメンバーを持つクラスである:

class TOtherClass 
{ 
public: 
    // Stuff 
    void DoSomething() const 
    { 
     for (u32 i; i < m_tItems.size(); ++i) 
      m_tItems[i]->DoStuff(); // Which is a const function 
    } 

private: 
    JFFVector<const JFFItem*> m_tItems; 
} 

「私のコンパイラは

なしオペレータを言って私の顔でエラーがスローされますということで問題は[] constのJFFVector [U32]

のtypedefのuint32_tのU32:「

オペランドの型があるこれらのオペランドにマッチします。

私が気づいたことの1つは、m_tItemsをポインタにすると、 "(* m_tItems)[i] - > DoStuff()"を実行して正常に動作することです。しかし、私は非ポインタバージョンではないのになぜこれが動作するのか分かりません。 (また、私はu32の代わりに単純なintを使ってみましたが、驚きはありませんでした)

私は何を間違えたのですか?そして、それほど些細なことがなければ、なぜそれは間違っていますか?

(これは既に回答されている場合は申し訳ありませんが、私は同様の問題を探してみましたが、この問題のように見える何も見つからなかった)

答えて

2

あなたがオーバーロードできる2つのインデックス演算子があります。あなたは2番目だけを実装しました。このオーバーロードはoperator[]に固有ではなく、すべてのメソッド(constまたは非constによって過負荷にすることができたことを

T const& operator[](u32 iIndex) const // <-- note the two `const`s 
{ 
    return m_pData[iIndex + miDataOffset]; 
} 

注:

あなたはそうのような非constバージョンと同様に、それを実装することができます)。

あなたのコード内のconstバージョンを必要とする理由はDoSomething()const宣言されていることで、これthisは、そのメソッド内でconst TOtherClass*あり、ひいてはそのすべてのメンバー、ここでは特にm_tItemsは、メソッド内constであり、これだけconstメソッドを呼び出すことができます。 m_tItemsのために定義されているのconstバージョンがないため、コンパイラはそのエラーを表示します。

+0

右を実装します。 Dayum。私は実際にその間違いのために落ちた。 ありがとうございました! – Thex

0

あなたは2バージョン、const用とconstないものを必要としています。 1つは不変のconst JFFVectorであり、もう1つはJFFVectorです。

この場合、DoSomethingはconst関数であり、const関数を呼び出す必要があります。 const JFFVector上で動作し、T const&を返し、JFFVector上で動作し、T&を返す1 1 -

template<class T> 
class JFFVector 
{ 
public: 
    //Init and stuff 
    T& operator[](u32 iIndex) 
    { 
     return m_pData[iIndex + miDataOffset]; 
    } 
    const T& operator[](u32 iIndex) const 
    { 
     return m_pData[iIndex + miDataOffset]; 
    } 

private: 
    T* m_pData; 
    u32 m_iDataOffset; 
} 
1

constにある場合は、constのままである必要があります。コンパイラは、m_tItems[i]で起こることがm_tItemsを変更しないことを知る簡単な方法がないため、void DoSomething() constTOtherClassの状態を変更しないという約束に違反します。

ソリューション:constoperator[]

const T& operator[](u32 iIndex) const 
{ 
    return m_pData[iIndex + miDataOffset]; 
} 
関連する問題