【发布时间】:2018-08-29 08:23:49
【问题描述】:
我正在使用模板构建一个多维数组,但在类型转换为基类时遇到问题。到目前为止,这是我的代码。
#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。
谢谢。
【问题讨论】:
-
从不转换为基类
-
这看起来坏了。首先,共享指针应该是
std::shared_ptr<T[]>来保存一个数组。但是,尝试使用指向基对象的指针来索引派生对象数组是行不通的。 -
代码审查:
t = o.t不会复制该值,它只是对相同的值进行另一个引用。 (因为t的类型是std::shared_ptr) -
@Quentin - C++17 不需要。
-
@PeterQuiring 是的,这就是我的意思。当然,您可以重载足够多的运算符,使其编译并且看起来很有意义,但是您的核心功能无法工作,因为您最终试图索引具有错误类型的数组。
标签: c++ arrays templates multidimensional-array