Объект класса не может получить доступ к своему собственному закрытому члену?

#c

#c

Вопрос:

Итак, в основном у меня есть этот фрагмент класса, который вызывает некоторые большие проблемы:

 namespace container {
template<typename T, std::size_t size>
class Array
{
private:
    T m_array[size];

    /* Note: All elements must be of the same type, aka the type used to declare the Array object */
public:
    // Needed to create subarray 
    template<std::size_t previousSize>
    Array(const Array<T, previousSize>amp; other, int begin, int end)
    {
        assert(begin >= 0 amp;amp; end < previousSize amp;amp; "Index must be >= 0 or less than the previous array's size");

        std::size_t index{ 0 };
        do {
            m_array[index] = other.m_array[begin];
              begin;
              index;
        } while (index < size amp;amp; begin <= end);

        while (index < size) {
            m_array[index] = T();
              index;
        }
    }

    template<std::same_as<T>...Args>
    explicit Array(const Argsamp;... args)
        : m_array{static_cast<T>(args)... }
    {}
 

И в main() я создаю два объекта:

 container::Array<int, 7> myarray{ 200, 500, 300, 499, 1, 10};
std::cout << myarray;
container::Array<int, 5> newArray{ myarray, 2, 4 };
std::cout << newArray;
 

Теперь проблема в том, что в этой строке:

 m_array[index] = other.m_array[begin];
 

Похоже, что «другой» не может получить доступ к своему закрытому члену m_array.
Код работает нормально, если я устанавливаю m_array в public . Если бы вы могли помочь мне понять, в чем проблема, это было бы очень ценно.

Комментарии:

1. Подсказка: Foo<BAR> это совершенно другой и не связанный тип с Foo<BAZ>

2. container::Array<int, 7> , и container::Array<int, 5> это два разных типа, поэтому ваше утверждение » Объект класса не может получить доступ к своему собственному закрытому члену » неверно, поскольку он пытается получить доступ к закрытому члену другого класса.

3. Есть ли какой-либо способ разрешить этому типу доступ к закрытому члену? Я думаю, что я здесь что-то упускаю из виду. Спасибо за быстрые ответы!

Ответ №1:

Более простой пример для той же проблемы заключается в следующем:

 template <int x>
struct Foo {
    
    template <int y>
    void foo(const Foo<y>amp; other) {
        value = other.value;
    }

    private:
        int value = 0;
};

int main() {
    Foo<1> a;
    Foo<2> b;
    a.foo(b);  // ERROR ! cannot acces private member
}
 

Здесь Foo<1> и Foo<2> два разных типа. Только экземпляр Foo<1> имеет доступ к закрытым членам Foo<1> .

Вы можете сделать все экземпляры друзьями друг друга:

 template <int x>
struct Foo {
    
    template <int y>
    void foo(const Foo<y>amp; other) {
        value = other.value;
    }

    template <int y> friend class Foo;

    private:
        int value = 0;
};

int main() {
    Foo<1> a;
    Foo<2> b;
    a.foo(b);  // OK !
}
 

Строка template <int y> friend class Foo; делает каждый экземпляр Foo друга любого другого экземпляра Foo .

Комментарии:

1. ВЫ, сэр, спасатель! Большое спасибо за вашу быструю помощь. Это определенно помешало решению проблемы!