2016-10-20 1 views
2

テンプレートクラスのContains()メソッドを使用しようとしていますが、奇妙な引数変換エラーが発生しています。コンパイラがconstパラメータを変更しているようです

エラーC2664: 'DynamicArrayは::(定数E)のconstが含まれていますBOOL':E =共同で 'constの共同*' から '共同* constの' から引数1を変換することはできません
変換を失い修飾子

これは、関連するテンプレートクラスコードです。

template <class E> 
class DynamicArray 
{ 
    bool Contains (const E element) const; 

    // Other code... 
}; 

template <class E> 
bool DynamicArray<E>::Contains(const E element) const 
{ 
    // Other code... 
} 

に行われたコールは、私がAnimatesJoint関数のシグネチャでのconstを削除した場合の方法はそうここ

bool ASMState::AnimatesJoint(const Joint* pJoint) const 
{ 
    return m_animatedJoints.Contains(pJoint); 
} 

関連するテンプレートクラスのコードASMState.h

class ASMState 
{ 
    DynamicArray<Joint*> m_animatedJoints; 

    // Other members... 

    bool AnimatesJoint(const Joint* pJoint) const; 

    // Other methods... 
}; 

で行われている含まれていそのように、bool ASMState::AnimatesJoint(Joint* pJoint) const、コードがコンパイルされます。できる限り私はそこにconstを保ちたいと思いますが、そのパラメータが私が書いたものから変わるように見える理由はわかりません。すなわち、コンパイラによれば、const Joint *からJoint *constまでである。

私は、Visual Studio 2013 Expressの

+1

コンパイラエラーにつながる問題がリンクされたスレッドのいずれかによって解決されないので、質問は重複しません。これはエラーにつながる 'Joint * const'変換ではなく、' Joint const * 'から' Joint * '変換への無効な' Joint * const'変換ではありません。また、後者の問題は、他の(ポインタではない)タイプと同じではありません。 – davidhigh

答えて

1

あなたのクラステンプレートDynamicArrayJoint *ようなタイプEを推定し、メンバ関数Containsに、あなたは基本的にconstを追加します。コメントに記載されており、コンパイラのエラーで既に述べたように、これは(これはJoint const*と同じです)ではなく、Joint * constになります。constを追加すると、 Eをポインタタイプで置き換えてください。

ただし、このキャストは許可されているため、Containsのポインタタイプにconstを追加することで問題はありません。問題は、むしろ関数Containsにconstポインタを渡すことですが、実際には非constポインタを期待しています。const Joint*からJoint *へのキャストは許可されていません。

constContains(const E)に削除しても、この特定の問題は解決されません。それにもかかわらず、const値でパラメータを取ることは決して役に立たないので、強くお勧めします。

すでに書いたように、AnimatesJoint(const Joint* pJoint)constを削除する必要があります。

-2

を使用しています

return m_animatedJoints.Contains(pJoint); 

にあなたはつまり、ポインタで、タイプconst E *の入力を渡しているのに対し、bool Contains (const E element) constは、タイプconst Eの入力を期待しているようです。

return m_animatedJoints.Contains(*pJoint); 

私は、コンパイラがconst EE = ... * const、すなわち定数ポインタとして入力pJointを渡そうとしているので、あなたが取得しているエラーであることを推測:おそらくソリューションは、この行を次のように変更することです。

+0

タイプ控除の仕組みを知っていますか? –

関連する問題