Добавлять дружественные функции/классы, довольно плохая идея с точки зрения архитектуры.
std::ostream operator<<(std::ostream& os, const Foo& foo)
. Список друзей определяется классом, скрывающем данные, поэтому друзья не нарушают сокрытия данных, а расширяют интерфейс класса. А подскажите если это возможно, как в этой ситуации пофиксить код https://godbolt.org/z/hYPaGM8nr
Window_mgr::Window_mgr()
: screens{ Screen(24, 80, ' ') } { }
но пока не удаётся собрать пазл.
#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;
}