オブジェクトを引数として取得し、その型を出力する問題を考えてみましょう。
#include <iostream>
class A { };
class B : public A { };
class C : public A { };
class D : public C, public B { };
using namespace std;
template<class T>
void print_type(T* info)
{
if(dynamic_cast<D*>(info))
cout << "D" << endl;
else if(dynamic_cast<C*> (info))
cout << "C" << endl;
else if(dynamic_cast<B*>(info))
cout << "B" << endl;
else if(dynamic_cast<A*> (info))
cout << "A" << endl;
}
int main(int argc, char** argv)
{
D d;
print_type(&d);
return 0;
}
「派生クラス「D」から基本クラスへのあいまいな変換」というエラーが発生します。
しかし、あいまいさがどこにあるのかわかりません。main(d)で宣言されたオブジェクトがタイプDの場合、タイプAに直接変換できないのはなぜですか。
また、もちろん文字列型の引数を渡すと、他のエラーが発生します。
'std::basic_string<char>' is not polymorphic
ジェネリックスのJavaには、次の構文があります<T extends A>
。この場合、それは役に立ちます。テンプレートを使用してC++で同様のものを作成するにはどうすればよいですか?
私はこのようにコードを変更しました:
#include <iostream>
#include <vector>
class A { };
class B : virtual public A { };
class C : virtual public A { };
class D : public C, public B { };
using namespace std;
template<class T>
void print_type(T* info)
{
if(dynamic_cast<D*>(info))
cout << "D" << endl;
else if(dynamic_cast<C*> (info))
cout << "C" << endl;
else if(dynamic_cast<B*>(info))
cout << "B" << endl;
else if(dynamic_cast<A*> (info))
cout << "A" << endl;
}
int main(int argc, char** argv)
{
string str;
print_type(&str);
return 0;
}
しかし、それでもエラーが発生します。'std::basic_string<char>' is not polymorphic