Конструктор пересылки с CRTP

Я использую класс шаблона с CRTP для реализации шаблона клонирования со вторым параметром шаблона Base, чтобы обеспечить несколько уровней наследования. Я получаю ошибку компилятора, когда пытаюсь вызвать косвенный конструктор базового класса.

class B
{
public:
    B() {} //trivial constructor
    virtual B* clone()=0;
};

template<class Base, class Derived>
class Clonable
    :public Base //weird, I know
{
public:
    virtual B* clone() {return new Derived(*this);}
};

class D1 : public Clonable<B, D1>
{
public:
    D1(int a); //non-trivial constructor. Different signature than B
};

class D2 : public Clonable<D1, D2>
{
public:
    D2(int a): D1(a) {} //compiler error here
}

Единственное решение, с которым я столкнулся до сих пор, - это использование конструктора вариативных шаблонов в Cloneable, но мой компилятор (VC ++ 11) еще не реализовал их.

0
задан Lucretiel 1 March 2012 в 17:12
поделиться