とある構造体への参照を返す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
こういうこと?
class baseXY : public base<TYPE_XY>
{
// 略
};
> baseXY xy;
で、
> 仮引数リストの指定
がないです。
baseXY< int > xy;
みたいにしないと。
> TYPE_XY
がなにものかワカリマセン。
> TYPE_XY& Get(){ return &m_st;};
virtual もないし、戻り値の型もちがう。(ついでに末尾の;は不要)
> 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);
}
>virtual もないし、戻り値の型もちがう。(ついでに末尾の;は不要)
&ほんとだ(汗)
いろいろ思いつきで書いて出来なかった・・・みたいな部分も多いのですが、
やりたいことのキモは
void* Get()
を作り変えて戻り値の型がわかる基本クラスを作りたいだけなんです。
って、もうレスついてた。。
>RAPT さん
後ほど結果報告したいと思います。
出来ました。
提示されたソースの通りで、私の書き方が悪かったようです。
もっと勉強してtemplateを使いこなせるようになりたいと思います。
回答してくださった皆様、ありがとうございました