Функция шаблона внутри класса шаблона является "закрытой в этом контексте" ошибка - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь написать свой собственный класс, который должен представлять шаблонный массив. Я хотел определить для него оператор +, но таким образом, чтобы он мог добавить два массива, указанных с разными типами (конечно, если один можно преобразовать в другой, и наоборот). Чтобы сделать это, я должен был создать шаблонное определение оператора (это вообще хорошо?), И после компиляции мой компилятор сообщает, что, по сути, как я понял, не могу найти ни одного из членов состояния моего учебный класс. Код ниже любой благодарной помощи ... потому что код прекрасно работает, когда все опубликовано c, но, очевидно, это не главное.

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;
      }

1 Ответ

0 голосов
/ 09 января 2020

Помните, что каждая MyArray специализация - это отдельный независимый класс. Класс всегда имеет доступ к своим собственным членам, но MyArray<int> и MyArray<long> не имеют доступа к членам друг друга!

Я бы сделал это operator+ неучастником friend. Часто трудно или даже невозможно должным образом подружить функцию-член, и есть также другие преимущества в создании симметричных c операторов, таких как двоичные + не-члены. Пока все три класса связаны друг с другом шаблоном функции, он может использовать их члены.

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])>
    {
        // ...
    }
};
...