我正在尝试编写自己的类,该类应该代表模板化数组。我想为其定义operator +,但是它可以添加两个以不同类型指定的数组(当然,如果一个可以提升为另一个,反之亦然)。为此,我必须对运算符进行模板化定义(这是个好方法吗?),并且在编译编译器后报告,据我所知,基本上找不到我的任何状态成员。类。代码低于任何可以帮助的帮助……因为当所有内容都公开时,代码可以很好地工作,但是显然那不是重点。
MyArray.hpp: In instantiation of ‘MyArray<decltype ((((MyArray<T>*)this)->MyArray<T>::ptr[0] + other[0]))> MyArray<T>::operator+(const MyArray<A>&) [with A = int; T = double; decltype ((((MyArray<T>*)this)->MyArray<T>::ptr[0] + other[0])) = double]’:
test3.cpp:65:3: required from here
MyArray.hpp:94:32: error: ‘int* MyArray<int>::ptr’ is private within this context
tmp[i] = ptr[i] + (other.ptr)[i];
~~~~~~~^~~~
MojNiz.hpp:9:12: note: declared private here
T* ptr = nullptr;
#include <iostream>
template <typename T>
class MyArray {
private:
T* ptr = nullptr;
size_t arraySize = 0;
size_t maxCapacity = 0;
public:
template <typename A>
auto operator+(const MyArray<A>& other)-> MyArray<decltype(ptr[0] + other[0])> {
if (arraySize != other.size()) throw std::invalid_argument("Nope");
MyArray<decltype(ptr[0] + other[0])> tmp;
tmp.ptr = new decltype(ptr[0] + other[0])[arraySize];
tmp.arraySize = arraySize;
for (int i = 0; i < arraySize; ++i) {
tmp[i] = ptr[i] + (other.ptr)[i];
}
return tmp;
}
[请记住,每个MyArray
专业化都是其自己的独立类。一个类总是有权访问其自己的成员,但是MyArray<int>
和MyArray<long>
不能访问彼此的成员!
我将使此operator+
成为非成员friend
。正确地使成员函数成为朋友通常很困难,甚至不可能,而且使对称运算符(如二进制+
)成为非成员还有其他好处。只要这三个类都与函数模板成为朋友,它就可以使用它们的成员。
template <typename T>
class MyArray {
// ...
template <typename A, typename B>
friend auto operator+(const MyArray<A>& arr1, const MyArray<B>& arr2)
-> MyArray<decltype(arr1[0] + arr2[0])>
{
// ...
}
};