Sub1 対 Sub1 , Sub1 対 Sub2 , Sub1 対 Sub2 , Sub2 対 Sub1 の4通りの インスタンス 対 引数 の組みあわせが考えられます.
そのうち後の2つは bool Sub1::func(const &Sub2) と bool Sub2::func(const &Sub1) の内部を同じ処理にすることで対応する予定です.
で,p->func(*q); //ここ の部分でエラーが発生し,赤い破線が引かれます.
Error: オーバーロードされた関数"Super::func"のインスタンスが引数リストと一致しません
引数の型: (Super)
オブジェクトの型は Super です
SuperとSuperで一致しているのに,何故このようなエラーが出発生するのでしょうか?
また,複数の組みあわせに対応する処理も面倒に見えますし,全体的に多様態を利用した(?)もっとうまい方法がある気がするのですが...
本当はSTGの長方形と円の当たり判定クラスなのですが,長いのでこのような名前にしました.
#include <iostream>
using namespace std;
class Super;
class Sub1;
class Sub2;
class Super{
public:
Super(){ next = 0; }
Super* next;
virtual bool func(const Sub1& sub1){
cout << "virtual bool func(const Sub1& sub1)" << endl;
return true;
}
virtual bool func(const Sub2& sub2){
cout << "virtual bool func(const Sub2& sub2)" << endl;
return true;
}
};
class Sub1 : public Super{
public:
Sub1(){ next = 0; }
bool func(const Sub1& sub1){
cout << "bool Sub1::hit(const Sub1&)" << endl;
return true;
}
bool func(const Sub2& sub2){
cout << "bool Sub1::hit(const Sub2&)" << endl;
return true;
}
};
class Sub2 : public Super{
public:
Sub2(){ next = 0; }
bool func(const Sub1& sub1){
cout << "bool Sub2::hit(const Sub1&)" << endl;
return true;
}
bool func(const Sub2& sub2){
cout << "bool Sub2::hit(const Sub2&)" << endl;
return true;
}
};
int main(void){
Super super = Super();
Sub1 sub11 = Sub1();
Sub1 sub12 = Sub1();
Sub2 sub21 = Sub2();
Sub2 sub22 = Sub2();
sub11.next = &sub12;
sub12.next = &sub21;
sub21.next = &sub22;
sub22.next = 0;
Sub1 sub13 = Sub1();
Sub1 sub14 = Sub1();
Sub2 sub23 = Sub2();
Sub2 sub24 = Sub2();
sub13.next = &sub14;
sub14.next = &sub23;
sub23.next = &sub24;
sub24.next = 0;
bool rtn=false;
for(Super *p = &sub11; p->next != 0; p = p->next){
for(Super *q = &sub13; q->next!=0; q = q->next){
if( p->func(*q) ){
rtn = true;
goto out;
}
out:
}
int i; std::cin >> i;
return 0;
}