• Почему нет доступа к приватному атрибуту?

    @code_panik
    MaratPetrov96, это не тот код, в этом нет friend функции. Она в https://pastebin.com/gbicDFBq. Как видно в https://godbolt.org/z/Pa8qbvse7 код с небольшими правками, не относящимися к вопросу, без проблем компилируется компилятором gcc 12.2. Программа завершается аварийно, но это уже к вопросу не относится.
  • Почему нет доступа к приватному атрибуту?

    @code_panik
    Добавлять дружественные функции/классы, довольно плохая идея с точки зрения архитектуры.

    Вообще не плохая. Тем более это единственный выход в случае, когда функция первым аргументом имеет объект другого класса, напр.
    std::ostream operator<<(std::ostream& os, const Foo& foo)
    . Список друзей определяется классом, скрывающем данные, поэтому друзья не нарушают сокрытия данных, а расширяют интерфейс класса.
  • Как убрать ошибки взаимодействия между классами?

    @code_panik
    colorname
    А подскажите если это возможно, как в этой ситуации пофиксить код https://godbolt.org/z/hYPaGM8nr

    Вынесите определение конструктора в window_mgr.cpp
    Window_mgr::Window_mgr()
     : screens{ Screen(24, 80, ' ') } { }
  • Почему при определении шаблона функции, принадлежащего шаблону класса, не нужно указывать шаблонный тип?

    @code_panik
    Qubc,
    но пока не удаётся собрать пазл.

    Рассмотрим пример синтаксиса частичной специализации.
    #include <iostream>
    #include <vector>
    using namespace std;
    
    // шаблон класса
    template<typename T1, typename T2, typename T3>
    class Foo {
    public:
        void talk() { cout << "Template class Foo\n"; }
    };
    
    // частичная специализация шаблона класса
    template<typename T>
    class Foo<int, T, char> { // скобки после имени - это специализация. Не все шаблонные параметры определены, поэтому специализация именно частичная.
    public:
        void talk() { cout << "Specialized class Foo\n"; }
    };
    
    // шаблон функции
    template<typename T1, typename T2>
    void func() { cout << "Template function func\n"; }
    
    // частичная специализация шаблона функции запрещена!
    template<typename T>
    void func<T, char>() { } // скобки после имени - это специализация. Здесь это синтаксическая ошибка.
    
    // полная специализация шаблона функции
    template<> // нет шаблонных параметров
    void func<int, char>() { cout << "Full specializatioin of func\n"; } // скобки после имени - это специализация
    
    int main()
    {
        Foo<vector<int>, double, char>().talk(); // Template class Foo
        Foo<int, double, char>().talk(); // Specialized class Foo
        func<double, char>(); // Template function func
        func<int, char>(); // Full specializatioin of func
        return 0;
    }

    Аналогично в вашем случае для шаблонной функции-члена шаблонного класса не нужно явно указывать тип в скобках после имени, т.к. иначе компилятор считает такое определение частичной специализацией функции, синтаксической ошибкой.