Наследование конструкторов работает только частично

У меня есть следующий класс, написанный так, чтобы работать полностью, каким бы ни было typedef:

class A
{
protected:
    typedef uchar mDataType;
    std::vector<mDataType> mData;

    uint32 mWidth;
    uint32 mHeight;

    friend class C;
public:
    A();
    A(void* data, uint32 width, uint32 height, size_t dataSize);
    A(const A& other);
    A(A&& other);
    A& operator=(const A& other);
    A& operator=(A&& other) = delete;

    ~A();
}

Я хотел сделать подкласс, который на самом деле почти такой же, за исключением перегруженного typedef:

class B : public A
{
private:
    typedef float mDataType;
public:
    using A::A;
    using A::operator=;
};

Чего я хотел добиться, так это создать класс B, который: - идентичен A - имеет все функции As (в A есть несколько функций-членов, которые я не написал) - имеет все операторы As - имеет все Как конструкторы - имеют разные typedef - имеют одинаковый деструктор

Мой код не работает, потому что я не могу вызвать B(void*, uint32, uint32, size_t), чего я и хочу. (Intellisense показывает мне только B() и B(const B&) в качестве доступных конструкторов).


person MKK    schedule 18.08.2015    source источник
comment
Какой компилятор вы используете? Вы уверены, что компилируете в режиме С++ 11 (или выше)?   -  person Some programmer dude    schedule 18.08.2015
comment
Какой компилятор? Visual Studio поддерживает наследование конструкторов только с 2015 года.   -  person Banex    schedule 18.08.2015
comment
Спасибо Большое! Я использую VS2013. Думаю, пора переходить на 2015 год...   -  person MKK    schedule 18.08.2015
comment
Вы знаете, что mData по-прежнему является std::vector<uchar>, и что все случаи использования mDataType в базовом классе относятся к uchar, независимо от того, что такое mDataType в подклассе?   -  person molbdnilo    schedule 18.08.2015
comment
Я хотел сделать так, чтобы объект базового класса имел std::vector‹uchar›, а объект подкласса — std::vector‹float›. Внутри реализации функций-членов я использую только mDataType, поэтому, надеюсь, достаточно изменить только его?   -  person MKK    schedule 18.08.2015
comment
@MKK Единственное, что вы можете переопределить, - это виртуальные функции-члены. Переопределение псевдонима типа (или переменной-члена) в подклассе не влияет на базовый класс. Вам нужен шаблон класса.   -  person molbdnilo    schedule 19.08.2015


Ответы (2)


Наследующими конструкторами являются поддерживается только с VC++2014 CTP 1.

person ecatmur    schedule 18.08.2015

Кажется, вы хотите template вместо наследования:

template <typename T>
class Mat
{
private:
    using DataType = T;
    std::vector<T> mData;

    uint32 mWidth;
    uint32 mHeight;

    friend class C;
public:
    Mat();
    Mat(void* data, uint32 width, uint32 height, size_t dataSize);
    Mat(const Mat& other);
    Mat(A&& other);
    Mat& operator=(const Mat& other);
    Mat& operator=(Mat&& other) = delete;

    ~Mat();
};


using A = Mat<uchar>;
using B = Mat<float>;
person Jarod42    schedule 18.08.2015
comment
Я предпочел использовать наследование, потому что с помощью указателя на базовый класс я мог работать с базовым классом и/или подклассом. Может быть, я поступил неправильно, и правильным способом было бы создать абстрактный базовый класс и 2 подкласса? Тогда я мог бы работать с обоими, используя один и тот же указатель (на базовый класс). Мне нужны 2 класса, на которые я могу ссылаться с помощью 1 указателя, потому что у меня есть std::vector этих классов в другом классе (класс C) и я хочу избежать дублирования кода. Как я уже писал в вопросе, мой код работает с любым типом данных, который вы ему даете, поэтому я также подумал о шаблоне... но как насчет этих указателей? - person MKK; 18.08.2015
comment
@MKK: Как указано в комментарии, в вашем коде B и A почти идентичны, у них обоих есть std::vector<uchar> mData; (да uchar). Трудно точно сказать, как разработать код, не зная class C. но в настоящее время B почти бесполезен. (Я также подозреваю, что ваш конструктор, который принимает void*, предназначен для общего решения, которое можно решить по-разному) - person Jarod42; 18.08.2015