没有从阵列<float>到阵列<int>的可行转换


#include <iostream>
using namespace std;
template<class T>
class Array {
public: // should be private, big ignore that
int n;
T *arr;
public:
Array(int sz, T initValue) {
n = sz;
arr = new T[n];
for (int i=0; i<n; i++) arr[i] = initValue;
}
Array& operator = (const Array& b) {
if (this!=&b) {
delete[] arr;
n = b.n;
arr = new T[n];
for (int i=0;i<n;i++) arr[i] = b.arr[i];
}
return *this;
}
Array operator + (const Array& b) {
Array res(n, 0);
for (int i=0; i<n;i++) res.arr[i] = arr[i] + b.arr[i];
return res;
}
};
int main()
{
Array<double> a(10, 1); //Array<double> b(10, 2); // this works
Array<int> b(10, 2);
a = b; // error
for (int i=0; i<10; i++) cout << i << " " << a.arr[i] << "n";
Array<double> c(10,0);
c = a + b; // error if b is <int>, runs if b is <double>
c = a - b;
c = a * b;
}

所以我有一个模板类,可以int, float, double,...

直观地说,Array<double> a; Array<int> b; a = b;应该是可能的,因为从元素上讲,我们可以做a[i] = b[i].但是,我有转换错误,因为缺少某些东西。

我怎样才能使a = b;成为可能?谢谢。

编辑:重点不是制作数组。它可以是矩阵,3dArray等。这是关于float templateint template.的分配 例如,您还可以将 int 替换为 float,并将 float 替换为 highPrecisionFloat。

编辑2:我忘了提,我不仅需要运算符=,还需要运算符+(和-*/等(。如果我用户@churill答案,我需要为每个运算符执行此操作。如何使从数组到数组的转换是隐式的?

在类模板中

template<class T>
class Array { ... }

Array标识符实际上是指Array<T>。您必须operator==模板,并且可能需要添加显式强制转换:

template<typename TOther>
Array<T> &operator = (const Array<TOther>& b) {
if constexpr (std::is_same<T, TOther>::value) {
// only check for self-assignment T and TOther are the same type
if (this == &b)
{
return *this;
}
}
delete[] arr;
n = b.n;
arr = new T[n];
for (int i=0;i<n;i++) 
arr[i] = static_cast<T>(b.arr[i]);
return *this;
}

请注意,std::is_same来自type_traits标头。

相关内容

  • 没有找到相关文章

最新更新