Ссылка на определение структуры внутри класса в CRTP

Я использую статический полиморфизм (метод CRTP) для создания иерархии классов. Идея состоит в том, чтобы использовать структуру, определенную в производном классе, в базовом. Однако VC10 генерирует следующую ошибку:

error C2039: 'param_t' : is not a member of 'D'

и Intel C ++ генерирует следующую ошибку:

error : incomplete type is not allowed

Это довольно странно, что Derived::param_t это struct тип и должен быть скомпилирован нормально. Пожалуйста, укажите на проблему в коде. Благодарю.

// Base class
template<typename Derived>
struct Base {
typedef typename Derived::param_t param_t; //error c2039

void setParam(param_t& param);
const param_t& getParam() const;
...

};

// Derived class
class D: public Base<D> {
public:
struct param_t {
double a, b, c;
};

D(param_t& param):param_(param) {}
...

protected:
param_t param_;

};

int main()
{
D::param_t p = {1.0, 0.2, 0.0};
D *pD = new D(p);
}

0

Решение

Вы не можете использовать типы из производного класса в определении базового класса. Вы можете использовать его только внутри тела функций-членов. Проблема в том, что typedef typename Derived::param_t param_t разрешен для class D: public Base<D> когда компилятор еще не знает о вложенных типах D. Функции-члены компилируются после фактического создания экземпляра D, когда доступно определение D.

Я думаю, что в вашем случае вы не можете использовать метод CRTP.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]