抽象基本クラスを使用しているときに、オーバーロード比較演算子をどのように実行する必要があるかを理解するのに苦労しています。主な問題は、その基本クラスを使用してポリモーフィズムを実現することです。これは抽象的であるため、インスタンス化できないため、派生クラスのメソッドにアクセスするには、その基本クラスへのポインターを使用する必要があります。状況をよりよく説明するために、いくつかのコードを追加します。
template <typename _Tp>
class Base
{
private:
_Tp attr ;
public:
foo() = 0 ;
friend bool operator == ( Base* b1, Base* b2)
{
return ( b1.attr == b2.attr ) ;
}
};
template <typename _Tp> class Derived_1 : public Base<_Tp> { /.../ } ;
template <typename _Tp> class Derived_2 : public Base<_Tp> { /.../ } ;
int main (void)
{
vector<Base*<int> > * v = new vector<Base*<int> > (2,0) ;
v[0] = new Derived_1 () ;
v[1] = new Derived_2 () ;
if ( (*v)[0] == (*v)[1] ) { /.../ }
return 0 ;
}
したがって、この時点で(*v)[0] == (*v)[1]
、 のポインター比較であることがわかりますBase*
。基本クラスで定義されているオーバーロードされた演算子は使用されないため、これら 2 つのポインター間の比較演算子をオーバーロードする方法があるかどうかを知りたいです。
応答後に編集:
私の実際のコードでは(*v)[0] == (*v)[1]
、データ構造が一般性を失うため、オブジェクトを比較することはできません。したがって、私があなたに尋ねようとしているのはこれです:
Base
ポインタの比較はできますか? どのように?
コンパイラから次のようなエラーが表示されます。
bool operator == (Base*,Base*) には、クラスまたは列挙型の引数が必要です。