抽象基本クラスとテンプレート化された派生クラスがあります。派生オブジェクトは、派生オブジェクトの前のインスタンスと、たとえば整数によって構築できます。これまでのところ
struct base {
/* ...pure virtual functions here... */
virtual ~base() = default;
/* NO DATA */
};
template <class D>
struct derived : base {
derived() = default;
derived(int x, const derived& previous) {
/* to construct I need access to previous.data_ */
}
/* ...overriden virtual functions here... */
~derived() = default;
D data_;
};
派生クラスのコンストラクターは、派生オブジェクトのdata_
メンバーにアクセスする必要があることに注意してください。ここで、整数と の以前のインスタンスを入力として取り、へのポインタを返すことによってprevious
型のオブジェクトを構築する関数を作成したいと考えています。問題は、ユーザーがクラス ポインターを操作するため、関数が次のようになることです。derived<D>
derived<D>
base
base
template <class D>
std::shared_ptr<base> getNext(int x, std::shared_ptr<base> current) {
return std::make_shared<derived<D>>(x, *current); /* ERROR */
}
base
ご想像のとおり、これにより、 からへの既知の変換がないことを示すコンパイル エラーが発生しderived<D>
ます。使用できることがわかっていることの 1 つstatic_cast<derived<D>&>(*current)
は、基になるオブジェクトの型が常に であるためderived<D>
です。ただし、理想的には、可能であればキャストを避けたいと考えています。この問題を克服する方法はありますか? 前もって感謝します!