テンプレートクラスへのポインタ – プログラミング – Home

テンプレートクラスへのポインタ
 
通知
すべてクリア

[解決済] テンプレートクラスへのポインタ


野木口
 野木口
(@野木口)
ゲスト
結合: 17年前
投稿: 11
Topic starter  

テンプレートクラスを継承したクラスを動的に切り替えたいので
下記のようにしたのですがうまくいきません。
どの様な解決方法があるのか、ご教授願います。

環境: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;
}


引用未解決
トピックタグ
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

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;
}


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

エラーが出るのは
> hoge *p;
ここじゃないですか?

「テンプレートクラス」じゃなくて「クラステンプレート」です。
クラスのテンプレート、つまりクラスの雛型、クラスを作る時に元にするものですから、
クラステンプレートはクラスではありません。
そこんとこ注意。


返信引用
野木口
 野木口
(@野木口)
ゲスト
結合: 17年前
投稿: 11
Topic starter  

たいちう様、解決策ありがとうございます。
ご提示頂いたソースコードでうまくいきました。
これをお手本にしていきたいと思います。

aetos様、ご指摘ありがとうございます。
用語の間違いはお恥ずかしい限りです。

もう一つのご指摘の方は、
うちのコンパイラでは通ってしまい、
強引にキャストすればポインタの代入までは行けてしまうんです。
そのお陰もありで分からなくなってしまったのですが
「クラステンプレートはクラスではない。」
を、念頭に置くことにします。

お二方ともありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました