模板类内部的模板函数“在此上下文中是私有的”错误

问题描述 投票:0回答:1

我正在尝试编写自己的类,该类应该代表模板化数组。我想为其定义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;
      }
class templates private friend
1个回答
0
投票

[请记住,每个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])>
    {
        // ...
    }
};
© www.soinside.com 2019 - 2024. All rights reserved.