Class 模板类内的模板函数“;在这种情况下是私有的”;错误

Class 模板类内的模板函数“;在这种情况下是私有的”;错误,class,templates,private,friend,Class,Templates,Private,Friend,我正在尝试编写我自己的类,它应该表示一个模板化数组。我想为它定义operator+,但它可以添加两个使用不同类型指定的数组(当然,如果一个可以升级到另一个,反之亦然)。为了做到这一点,我必须对操作符进行模板化定义(这是一个好方法吗?),编译后,我的编译器报告说,基本上,正如我所理解的,找不到我类的任何状态成员。代码在下面,欢迎您的帮助。。。因为当所有东西都是公开的时候,代码工作得非常好,但显然这不是重点 MyArray.hpp: In instantiation of ‘MyArray<d

我正在尝试编写我自己的类,它应该表示一个模板化数组。我想为它定义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.hpp:在“MyArrayMyArray::ptr[0]+其他[0])的实例化中>MyArray::operator+(const MyArray&)[with A=int;T=double;decltype(((MyArray*)this)->MyArray::ptr[0]+其他[0])=double]:
test3.cpp:65:3:从这里开始需要
MyArray.hpp:94:32:错误:“int*MyArray::ptr”在此上下文中是私有的
tmp[i]=ptr[i]+(other.ptr)[i];
~~~~~~~^~~~
MojNiz.hpp:9:12:注意:此处声明为私有
T*ptr=nullptr;
#包括
模板
类MyArray{
私人:
T*ptr=nullptr;
大小\u t阵列大小=0;
大小\u t最大容量=0;
公众:
模板
自动运算符+(常量MyArray和其他)->MyArray{
if(arraySize!=other.size())抛出std::invalid_参数(“Nope”);
MyArray tmp;
tmp.ptr=新的decltype(ptr[0]+其他[0])[arraySize];
tmp.arraySize=arraySize;
for(int i=0;i
请记住,每个
MyArray
专门化都是它自己的独立类。一个类始终可以访问它自己的成员,但是
MyArray
MyArray
不能访问彼此的成员

我会让这个
操作符+
成为非成员的
朋友
。通常很难甚至不可能正确地与成员函数建立朋友关系,而且让对称操作符(如二进制
++
非成员)也有其他好处。只要这三个类都涉及函数模板,它就可以使用它们的memb呃

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])>
    {
        // ...
    }
};
模板
类MyArray{
// ...
模板
friend自动运算符+(常量MyArray和arr1,常量MyArray和arr2)
->MyArray
{
// ...
}
};

请同时粘贴完整的编译器错误消息。另外,
其他[0]
表示有一个
运算符[]
-有吗?@aschepler,谢谢,我添加了编译器错误消息。是的,有运算符[]对于我的类和所有其他类来说,基本上我想说的是,如果我将状态声明为公共状态,我的代码就可以完美地工作