Вы происходите B
от A<B>
, таким образом, первая вещь, которую делает компилятор, как только это видит определение класса B
, состоит в том, чтобы попытаться инстанцировать A<B>
. Чтобы сделать это, этому нужно к известному B::mytype
для параметра action
. Но так как компилятор находится только в процессе выяснения фактического определения B
, это еще не знает этот тип, и Вы получаете ошибку.
Один путь вокруг этого, должен был бы объявить тип параметра как другой шаблонный параметр, вместо внутренней части производный класс:
template<typename Subclass, typename Param>
class A {
public:
void action(Param var) {
(static_cast<Subclass*>(this))->do_action(var);
}
};
class B : public A<B, int> { ... };
Поле модели уже является свойством, поэтому я бы сказал, что вы должны сделать это вторым способом, чтобы избежать конфликта имен.
Когда вы определяете foo = свойство (..)
фактически перекрывает foo = models ..
строка, так что это поле больше не будет доступно.
Вам нужно будет использовать другое имя для свойства и поля. Фактически, если вы сделаете это так, как в примере №1, вы получите бесконечный цикл, когда попытаетесь получить доступ к свойству, поскольку теперь оно пытается вернуть себя.
РЕДАКТИРОВАТЬ: Возможно, вам также следует рассмотреть возможность отказа от использования _foo
в качестве имени поля, а скорее foo
,