Мне что-то непонятно, я хочу обратить ваше внимание, пожалуйста, проверьте эти фрагменты кода:
template< typename DerivedClass >
class construction_management
{
city* this_city;
public:
construction_management()
{
this_city = static_cast< city* >(this);
}
~construction_management();
};
Я намеренно удалил весь ненужный код, посмотрите на конструктор, который делает статическое приведение указателя this к типу city, который определяется, как показано ниже:
class city : public construction_management< city >
{
public:
public:
city( const string& name, const string& owner );
};
Класс намеренно пуст, так как я думаю, что ничего из того, что он может содержать, здесь не имеет значения. Хочу, чтобы я не мог на 100% понять, что здесь происходит, g++ 4.7.2 не выводит предупреждение или ошибку на этапе компиляции, и всякий раз, когда я использую указатель this_city, я могу получить доступ ко всем публичным членам города, сам объект выглядит согласованным, поскольку все переменные правильно инициализированы и всегда содержат действительные данные.
Что я хочу знать, так это то, почему этот код не работает, если я определяю Construction_management как простой нешаблонный класс? Приведение не выполняется из-за предварительного преобразования из константного в неконстантный указатель на город, почему?
Это печать ошибки:
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?
Спасибо вам всем.