私は(とにかく私のレベルのために)むしろ複雑なテンプレートの問題でいくつかの援助をいただければ幸いです。C++テンプレートのトラブル
最初に「システム」を説明しましょう。
バッファ、プレーヤーからのデータを処理し、そこから:基本的なオーディオミキシングおよびストリーミングシステムのモデリング
、それは3つの構成要素を有しています。 これらはデータで直接接続されているため、データは同じタイプのものにする必要があります。従ってBuffer<T> ~ Player<T>
、ここでテンプレートはと一致しなければならない。
これらは、最終的にすべての着信バッファを1人のプレーヤーに管理するのマネージャーでラップされます。
バッファとプレーヤーはどちらも異なる実装が必要なので、汎用ののインタフェースで表され、iPlayerとiBufferとなります。
simple_manager<simple_player<float>>;
やIM最初のものでも解決策を持っているかわからない、私の試み以来、この少なくとも
simple_manager<simple_player , float>;
を失敗:
私の目標は、このようなマネージャーを宣言することができることですこのようにして:
template <typename K>
class iManager {
private:
K player;
};
template <template <typename> class C , typename T>
class simple_manager : iManager< C<T> > {
public:
void play(iBuffer<T> & _buffer,const audio_descriptor ad, bool * condition){
player.play(_buffer,ad,condition);
}
};
ご覧のとおり、具体的なクラスでは、Tはデータの種類をCは私が使用したい具体的なクラスのプレイヤーです。 インターフェイスには、具象プレーヤークラスを再度マークするテンプレートが1つしかありません。
simple_manager.cpp: In member function ‘void simple_manager<C, T>::play(iBuffer<T>&, audio_descriptor, bool*)’:
simple_manager.cpp:18:12: error: ‘player’ was not declared in this scope
player.play(_buffer,ad,condition);
^~~~~~
を、私はこのことを原因かわからない:だからK ~ C<T>
これは(のみ)、次のエラーでコンパイルされません。コンパイラは、iPlayerがplay()メソッドを実装しなければならないので、TがiPlayerから継承されなければならないと推論することはできません。
私はそれが実際に私はこのようなsimple_managerを定義する場合は仕事を得ることができます:
class simple_manager : iManager< simple_player<float> > {...}
それはまだでに動作しません。
class simple_manager : iManager< simple_player<T> > {...}
私は困惑しています。もし私が<T extends iPlayer>
をJavaから持っていれば、これはうまくいくかもしれませんが、コンパイル時のテンプレートは私が推測するより厳しいナットです。
ご協力いただければ幸いです!
だけで名前の検索よりも多くの問題があるとして、私は、再度開くために投票し、私は考えますOPは彼の最初の例の解決策も望んでいます。あなたが同意しない場合は、もう一度閉じるために投票してください。 – TartanLlama