nagaのプログラム備忘録

自分のぶつかったことや学んだことについて書き残します

~やりたいことのごった煮~

わからないことを解決する~継承とクラステンプレート~

さて、あるクラスで別のクラスを使おうとしました。その時に使うクラスがわかっていないのでクラステンプレートを使うほかありません。


template<class T>
class I_SpeedChange{
~~省略~~
};

class proportional : private I_SpeedChange{
~~省略~~
};


これでコンパイルすると

クラス テンプレート "base" の引数リストがありません

と、言われてしまいました

これは困ったぞ……

 

いろいろ調べた結果、クラステンプレートはクラスに対してテンプレートTを提供するとのこと

 

つまり……

template<class T>
class base{
~~省略~~
};

template<class T>
class derived : private base{
~~省略~
};

 

テンプレートお前めんどくさいな

テンプレートの作用するスコープがどこの範囲かって言われたらそうなんだけどね

 

継承先でもテンプレート書かなきゃいけないのめんどくさすぎ……

じゃあここに親クラスの変数を呼び出してみよう

って思っていたのですが……

できないんですよこれが

 

色々調べた結果このサイトが見つかりました

qiita.com

rpgincpp.cocolog-nifty.com

 

にゃるほど~

関数つくってthisで解決するかbase<T>:: で解決するのがいいのか

 

じゃあ孫クラスに継承してみようということで(菱形継承、ダイヤモンド継承)

 

template<class T>
class base{
~~省略~~
};

template<class T>
class derived : virtual public base{
~~省略~
};

template<class>
class derivedX : public derivedA{
~~省略~~
};

 

baseのサブクラスを一つしか書いていませんがいずれ増やす予定なので仮想継承しています

これで孫クラスから基底クラスへのアクセスも可能です(少なくともコンパイラ上は)

 

ようやくクラステンプレート解決しました

むぅ、つかれたのでちょっと休憩したいと思います

 

読んでいただきありがとうございました