Я пытаюсь реализовать перегруженный оператор приведения в моем шаблонном array2d
классе, используя тип T
.Поэтому я должен выполнить приведение с array2d<T>
к новому array2d<E>
.
. Я могу выполнить само приведение, но возникают проблемы, когда я пытаюсь установить приведенные данные на новый экземпляр * 1007.*.Компилятор говорит мне, что оператор приведения не имеет доступа к закрытым членам array2d
Вот где я до сих пор (для краткости отредактировал несвязанный код)
array2d.h
template<typename T>
class array2d {
private:
// Member Variables
T** data;
size_t width, height;
public:
// constructors, methods, etc...
// Cast Operator
template<typename E>
operator array2d<E>() const;
};
// Other overloaded operators...
// Overloaded Casting Operator
template<typename T>
template<typename E>
array2d<T>::operator array2d<E>() const{
// Create new instance
array2d<E> castedArr(width, height);
// Allocate memory for the casted data, then cast each element
E** newData = new E*[castedArr.get_height()];
for (size_t i = 0; i < castedArr.get_height(); i++){
newData[i] = new E[castedArr.get_width()];
for (size_t j = 0; j < castedArr.get_width(); j++){
newData[i][j] = (E)data[i][j];
}
}
// issue here, can't set data because it's private.
castedArr.data = newData;
delete [] newData;
newData = nullptr;
return castedArr;
}
main.cpp
#include "array2d.h"
int main(int argc, char *argv[]) {
// Cast Operator
// Create an array2d<T> of
// width = 5
// height = 5
// fill all elements with 42.1
array2d<double> x(5, 5, 42.1);
// Create a new array exactly the same as
// x, where x is casted to int
array2d<int> y = (array2d<int>) x;
return 0;
}
Это смутило меня, так как у меня есть много других перегруженных операторов, которые могут получить доступ только к закрытым членамнормально, используя практически ту же логику.
Почему это происходит и что я могу сделать, чтобы исправить это?