我正在使用模板构建一个多维数组,但我遇到了类型转换为基类的问题。到目前为止,这是我的代码。
#include <memory>
struct A {
int a;
};
struct B : A {
int b;
};
template<typename T>
struct Array {
std::shared_ptr<T> t;
int length;
T operator[](int x) {
return t[x];
}
Array() {}
template<typename T2>
Array(Array<T2> o) {
t = o.t;
length = o.length;
}
};
int main() {
Array<B> b;
Array<A> a = b; //OK
Array<Array<B>> bb;
Array<Array<A>> aa = bb; //Error
return 0;
}
一维类型转换有效,但多维失败。
我得到的错误是
cannot convert 'Array<B>* const' to 'Array<A>*' in assignment
我错过了操作员或其他什么吗? 无论创建多少维度,我都需要能够发挥作用的东西。
为了清楚起见,Array类删除了很多函数,我只需要使用类型转换来工作。
注意:std :: shared_ptr :: operator []将需要C ++ 17。
感谢。
答案 0 :(得分:0)
好吧,我找到了一个可能的解决方案:
#include <memory>
struct A {
int a;
};
struct B : public A {
int b;
};
template<typename T>
struct A1 {
T **t;
A1() {}
T operator[](int idx) {
return *t[idx];
}
template<typename T2>
A1(A1<T2>* o) {
t = (T*)o->t;
}
template<typename T2>
A1(A1<T2> o) {
t = (T*)o.t;
}
};
template<typename T>
struct A2 {
A1<T> *t;
A2() {}
A1<T> operator[](int idx) {
return t[idx];
}
template<typename T2>
A2(A2<T2>* o) {
t = (A1<T>*)o->t;
}
template<typename T2>
A2(A2<T2> o) {
t = (A1<T>*)o.t;
}
};
template<typename T>
struct A3 {
A2<T> *t;
A3() {}
A2<T> operator[](int idx) {
return t[idx];
}
template<typename T2>
A3(A3<T2>* o) {
t = (A2<T>*)o->t;
}
template<typename T2>
A3(A3<T2> o) {
t = (A2<T>*)o.t;
}
};
int main() {
A3<B> b3;
A3<A> a3 = b3;
A2<A> a2_ = b3[5];
A2<A> a2 = a3[1];
A a = a3[5][2][1];
A3<int> i1;
return 0;
}
每个维度需要一个类,但我从不需要超过3个级别。这允许所需的类型转换,使用指针数组,因此使用基类应该可以工作。