私のコードの簡略化されたバージョンは次のようになります。
template <class T>
struct Base
{
void SayHello( T* aDerived )
{
}
void SaySomething()
{
SayHello( this ); // This is where the error happens
}
};
struct Derived : public Base< Derived >
{
};
int main(int argc, const char * argv[])
{
Derived iDerived;
iDerived.SaySomething();
}
SayHello( this )
そして、次のエラーメッセージが表示された行ではコンパイルされません。
Cannot initialize a parameter of type 'Derived *'
with an rvalue of type 'Base<Derived> *'
これで、コンパイラがこれについて文句を言うのは理にかなっていますが、私には少しばかげているように見えますが、この行を削除しても文句はありません。
iDerived.SaySomething();
とにかく、この問題は、次のように明示的な型キャストを行うことで解決できます。
SayHello( (T*)this );
実際のコードはこれらのタイプキャストの多くで終わるということです。Base
テンプレートクラスに自動的にタイプキャストできるようにするものに含めるのが妥当なようです(T
)。
それはoperator=
私が求めているのですか?誰かがこれがどのように行われるかについてのコードサンプルを提供できますか?この質問は、私が次のようなことができることを示唆しています。
キャストは常にとの間this
ですT*
。
operator T*()
{
return (T*)this;
}
しかし、エラーは残ります。