CRTPを使用しているときにオブジェクトスライスの問題が発生しました。次の模擬は私の問題を示しています。上記のコードをコンパイルするCRTPを使用しているときのオブジェクトのスライシング
#include <memory>
class CrtpGenr
{
};
template<class t_object>
class CrtpBase : public CrtpGenr
{
public:
static
auto create() -> std::unique_ptr<t_object> {
return(std::unique_ptr<t_object>(new t_object));
}
void funct1(){}
};
class CrtpDirv1 : public CrtpBase<CrtpDirv1>
{
public:
void funct2(){}
};
class CrtpDirv2 : public CrtpBase<CrtpDirv2>
{
public:
void funct2(){}
};
int main()
{
/*
// This works
std::unique_ptr<CrtpDirv1> crtp_obj = CrtpDirv1::create();
crtp_obj->funct1();
crtp_obj->funct2();
*/
std::unique_ptr<CrtpGenr> crtp_obj1 = static_cast<std::unique_ptr<CrtpGenr>>(CrtpDirv1::create());
std::unique_ptr<CrtpGenr> crtp_obj2 = static_cast<std::unique_ptr<CrtpGenr>>(CrtpDirv2::create());
crtp_obj1->funct1();
crtp_obj1->funct2();
return 0;
}
は私に次のエラー与える:
main.cpp: In function 'int main()':
main.cpp:47:16: error: 'class CrtpGenr' has no member named 'funct1'
crtp_obj1->funct1();
^
main.cpp:48:16: error: 'class CrtpGenr' has no member named 'funct2'
crtp_obj1->funct2();
を私はCrtpGenrにCrtpDirv1とCrtpDirv2クラスをキャストできるようにしたいと思います。これは、CrtpDirv1またはCrtpDirv2のオブジェクトを保持するためのCrtpGenr型のコンテナを定義できるようにするためです。私は間違って何をしていますか?
'static_cast'はコンパイルすべきではありません。すべてのエラーを提供していますか? –
@ Alf:はい私はcoliruで同じ正確なコードをコンパイルしました。私が提供したエラーはそこに与えられているものです。 [リンク](http://coliru.stacked-crooked.com/a/5a643b61336c250c) – vixiv
@alf - static_castsはうまくコンパイルされます(http://cpp.sh/8zg6)。しかし、誰がなぜ47行目と48行目がコンパイルされると思うのか分かりません。 – Arunas