私があなたの注意を引きたいと思うことがはっきりしないことがあります、それらのコードスニペットをチェックしてください:
template< typename DerivedClass >
class construction_management
{
city* this_city;
public:
construction_management()
{
this_city = static_cast< city* >(this);
}
~construction_management();
};
不要なコードをすべて意図的に削除しました。以下のように定義されている、タイプ「city」への「this」ポインターの静的キャストを作成するコンストラクターを確認してください。
class city : public construction_management< city >
{
public:
public:
city( const string& name, const string& owner );
};
クラスに含めることができるものはここでは関係ないと思うので、クラスは意図的に空になっています。ここで何が起こっているのかを100%理解できないようにしたい場合、g ++ 4.7.2はコンパイル段階で警告やエラーを出力せず、「this_city」ポインターを使用するたびに、市のすべてのパブリックメンバーにアクセスできます。すべての変数が適切に初期化され、常に有効なデータが含まれているため、オブジェクト自体は一貫しているように見えます。
私が知りたいのは、construction_managementを単純な非テンプレートクラスとして定義した場合にこのコードが機能しないのはなぜですか?constからconst以外の都市へのポインタへの暫定的な変換が原因で、キャストが失敗します。なぜですか?
これはエラー印刷です:
game.hpp: In constructor 'city_manager::construction_management::construction_management()':
game.hpp:164:41: error: invalid static_cast from type 'city_manager::construction_management* const' to type 'city_manager::city*'
そして、construction_managementがテンプレートである場合、なぜ機能するのでしょうか。これは一種のCRTPですか?
皆さん、ありがとうございました。