テンプレートの継承について – プログラミング – Home

テンプレートの継承について
 
通知
すべてクリア

[解決済] テンプレートの継承について


てんてく
 てんてく
(@てんてく)
ゲスト
結合: 20年前
投稿: 92
Topic starter  

とある構造体への参照を返すGet()を派生クラスへ継承させたいので
(この時点では構造体の型は不明)

template <class T>
class base
{
public:
base(){};
~base(){};

virtual T& Get() = 0;
};

そしてこれを継承したクラス

template <class T>
class baseXY : public base<T>
{
public:
baseXY(){};
~baseXY(){};

TYPE_XY m_st; //TYPE_XYは構造体

TYPE_XY& Get(){ return &m_st;};
};

を作りました。ところが baseXY xy;
が作成できないんです。baseXYの実装方法が間違えてると思うのですが
正しい実装方法を教えてください。エラーは
error C2955: 'baseXY' : クラスのテンプレート名で仮引数リストの指定がありません。
error C2133: 'xy' : サイズが不明です。
error C2512: 'baseXY' : クラス、構造体、共用体にデフォルト コンストラクタがありません
error C2262: 'xy' : 壊せません。

ちなみにこのクラスはこのように使うつもりです。

void SendData(base* p)
{
send((void*)&p->Get(), sizeof(p->Get()));
}

環境Win2000 VC++6.0


引用未解決
トピックタグ
REE
 REE
(@REE)
ゲスト
結合: 23年前
投稿: 240
 

こういうこと?

class baseXY : public base<TYPE_XY>
{
// 略
};


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> baseXY xy;
で、
> 仮引数リストの指定
がないです。
baseXY< int > xy;
みたいにしないと。

> TYPE_XY
がなにものかワカリマセン。

> TYPE_XY& Get(){ return &m_st;};
virtual もないし、戻り値の型もちがう。(ついでに末尾の;は不要)


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 21年前
投稿: 310
 

> TYPE_XY& Get(){ return &m_st;}
書き方が変です。

参照を返すなら、
TYPE_XY& Get(){ return m_st;}

ポインタを返すなら、
TYPE_XY* Get(){ return &m_st;}

※以下のコードは参考になりますか?

// 基底クラス
template <class T>
class base
{
public:
base(){}
virtual ~base(){}
virtual T& Get() = 0;
virtual size_t size() const = 0;
};

// 構造体
struct TYPE_XY
{
};

// 構造体を使用する派生クラス
class baseXY : public base<TYPE_XY>
{
TYPE_XY m_st;
public:
baseXY(){}
virtual ~baseXY(){}
virtual TYPE_XY& Get()
{
return m_st;
}
virtual size_t size() const
{
return sizeof TYPE_XY;
}
};

// 実処理関数
void send(void*, size_t)
{
//何か処理
::MessageBox(NULL, stub, NULL, MB_OK);
}

// テンプレート受け関数
template<class T>
void SendData(base<T>* p)
{
send(reinterpret_cast<void*>(&p->Get()), p->size());
}

// テスト用ドライバ関数
void driver()
{
baseXY xy;
SendData(&xy);
}


返信引用
てんてく
 てんてく
(@てんてく)
ゲスト
結合: 20年前
投稿: 92
Topic starter  

>virtual もないし、戻り値の型もちがう。(ついでに末尾の;は不要)
&ほんとだ(汗)

いろいろ思いつきで書いて出来なかった・・・みたいな部分も多いのですが、
やりたいことのキモは

void* Get()

を作り変えて戻り値の型がわかる基本クラスを作りたいだけなんです。


返信引用
てんてく
 てんてく
(@てんてく)
ゲスト
結合: 20年前
投稿: 92
Topic starter  

って、もうレスついてた。。

>RAPT さん
後ほど結果報告したいと思います。


返信引用
てんてく
 てんてく
(@てんてく)
ゲスト
結合: 20年前
投稿: 92
Topic starter  

出来ました。
提示されたソースの通りで、私の書き方が悪かったようです。
もっと勉強してtemplateを使いこなせるようになりたいと思います。

回答してくださった皆様、ありがとうございました


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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