テンプレートクラスを継承したクラスを動的に切り替えたいので
下記のようにしたのですがうまくいきません。
どの様な解決方法があるのか、ご教授願います。
環境:WinXp VC++6.0
#include <windows.h>
#include <stdio.h>
template <class U>
class hoge {
public:
U data;
void Draw() {
printf(size(%d) , sizeof(U));
printf(data(%d)\n, data);
}
};
class hoge1: public hoge<char> {
public:
hoge1(char d) { data = d; }
};
class hoge2: public hoge<long> {
public:
hoge2(long d) { data = d; }
};
int main()
{
hoge1 h1(100);
hoge2 h2(10000);
hoge *p;
h1.Draw(); // size(1) data(100)
h2.Draw(); // size(4) data(10000)
p = &h1; // error
p->Draw(); // error
p = &h2; // error
p->Draw(); // error
return 0;
}
VC2008でのみ動作確認。VC6で通るかはわかりませんが。
class base {
public:
virtual void Draw() = 0;
};
template <class U>
class hoge : public base {
public:
U data;
virtual void Draw() {
printf(size(%d) , sizeof(U));
printf(data(%d)\n, data);
}
};
class hoge1: public hoge<char> {
public:
hoge1(char d) { data = d; }
};
class hoge2: public hoge<long> {
public:
hoge2(long d) { data = d; }
};
int main()
{
hoge1 h1(100);
hoge2 h2(10000);
hoge<char> *p1;
hoge<long> *p2;
h1.Draw(); // size(1) data(100)
h2.Draw(); // size(4) data(10000)
p1 = &h1;
p1->Draw();
p2 = &h2;
p2->Draw();
base *b;
b = &h1;
b->Draw();
b = &h2;
b->Draw();
return 0;
}
エラーが出るのは
> hoge *p;
ここじゃないですか?
「テンプレートクラス」じゃなくて「クラステンプレート」です。
クラスのテンプレート、つまりクラスの雛型、クラスを作る時に元にするものですから、
クラステンプレートはクラスではありません。
そこんとこ注意。
たいちう様、解決策ありがとうございます。
ご提示頂いたソースコードでうまくいきました。
これをお手本にしていきたいと思います。
aetos様、ご指摘ありがとうございます。
用語の間違いはお恥ずかしい限りです。
もう一つのご指摘の方は、
うちのコンパイラでは通ってしまい、
強引にキャストすればポインタの代入までは行けてしまうんです。
そのお陰もありで分からなくなってしまったのですが
「クラステンプレートはクラスではない。」
を、念頭に置くことにします。
お二方ともありがとうございました。