#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. ВЫ, сэр, спасатель! Большое спасибо за вашу быструю помощь. Это определенно помешало решению проблемы!