抽象基本クラスとテンプレート化された派生クラスがあります。派生オブジェクトは、派生オブジェクトの前のインスタンスと、たとえば整数によって構築できます。これまでのところ
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>basebase
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>です。ただし、理想的には、可能であればキャストを避けたいと考えています。この問題を克服する方法はありますか? 前もって感謝します!