У меня есть следующий класс, написанный так, чтобы работать полностью, независимо от того, какой 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, то есть:
— идентично А
— имеет все функции As (есть несколько функций-членов в A, которые я не написал)
— имеет все операторы As
— имеет все конструкторы As
— имеет другой typedef
— имеет тот же деструктор
Мой код не работает, потому что я не могу вызвать B (void *, uint32, uint32, size_t), что я и хочу. (Intellisense показывает мне только B () и B (const B&) как доступные конструкторы).
Наследующие конструкторы поддерживается только с VC ++ 2014 CTP 1.
Кажется, что вы хотите 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>;