次のような CRTP クラスに割り当てられたコードがあります。
IChunkWindow<WindowDerived, IChunk<ChunkDerived>> editWindow = chunkWindow.create(
chunkWindow.getOrigin().getX() + x / ChunkDimensions::MAX_X,
chunkWindow.getOrigin().getZ() + z / ChunkDimensions::MAX_Z,
chunkWindow);
これは CRTP クラスです。
template <class Derived, class T>
struct IChunkWindow : public IWindow<IChunkWindow<Derived,T>, T> {
Point3D const& getOrigin() const {
return static_cast<Derived const*>(this)->getOrigin();
}
void setOrigin(Point3D const& origin) {
this->origin = origin;
static_cast<Derived*>(this)->setOrigin(origin);
}
T* getChunk(int cx, int cz) {
return static_cast<Derived*>(this)->getChunk(cx,cz);
}
void setChunk(int cx, int cz, T* ptr) {
static_cast<Derived*>(this)->setChunk(cx,cz,ptr);
}
unsigned char getTerrainBlock(int x, int y, int z) const {
return static_cast<Derived const*>(this)->getTerrainBlock(x,y,z);
}
void setTerrainBlock(int x, int y, int z, unsigned char value) {
static_cast<Derived*>(this)->setTerrainBlock(x,y,z,value);
}
unsigned char getLightBlock(int x, int y, int z) const {
return static_cast<Derived const*>(this)->getLightBlock(x,y,z);
}
void setLightBlock(int x, int y, int z, unsigned char value) {
static_cast<Derived*>(this)->setLightBlock(x,y,z,value);
}
unsigned char getMetaBlock(int x, int y, int z) const {
return static_cast<Derived const*>(this)->getMetaBlock(x,y,z);
}
void setMetaBlock(int x, int y, int z, unsigned char value) {
static_cast<Derived*>(this)->setMetaBlock(x,y,z,value);
}
bool isChunkDirty(int cx, int cz) {
return static_cast<Derived*>(this)->isChunkDirty(cx,cz);
}
bool inBounds(int x, int y, int z) {
return static_cast<Derived*>(this)->inBounds(x,y,z);
}
bool inBounds(int a_cx, int a_cz) {
return static_cast<Derived*>(this)->inBounds(a_cx, a_cz);
}
void insert(int a_x, int a_y, int a_z, unsigned char blockType) {
static_cast<Derived*>(this)->insert(a_x,a_y,a_z,blockType);
}
void remove(int a_x, int a_y, int a_z) {
static_cast<Derived*>(this)->remove(a_x, a_y, a_z);
}
std::vector<BlockPosition> waterPhysics(int a_x, int a_y, int a_z, std::vector<BlockPosition> const& waterSources) {
static_cast<Derived*>(this)->waterPhysics(a_x,a_y,a_z, waterSources);
}
IChunkWindow<Derived, T> create(int a_cx, int a_cz, IChunkWindow<Derived, T> & otherWindow) {
return static_cast<Derived*>(this)->create(a_cx, a_cz, otherWindow);
}
};
editWindow でメソッド呼び出しを行うことはできますが、基本クラスのプライベート データ (表示されていません) がガベージであるため、割り当てが失敗しているように見えます。これを機能させるには、IChunkWindow クラスの代入演算子をオーバーライドする必要がありますか?