Spójrz na tę linijkę jakie masz nazwy tych obiektów tego szablony? q i n :)
hold<T> q; // obiekt szablonu
hold<int> n; // obiekt szablonu
A teraz popatrz co robisz w liście inicjalizacyjnej w konstruktorze klasy beta.
beta( T t, int i) : q(t), n(i) {}
masz obiekt n(i) i q(t) czyli dla q jest to typ danych T czyli dowolny podany przy tworzeniu obiektu. Dla drugiego jest to już z góry ustalone przez programistę bo chce on tam widzieć intigera nic więcej jak widać a co do wyników to w tym programie funkcja
U blab(U u, T t) { return (n.Value() + q.Value()) * u / t; }
zwraca typ U czyli zwraca typ pierweszego argumentu.
cout << guy.blab(10, 2.3) << endl;
cout << "U określono jako int\n";
cout << guy.blab(10.0, 2.3) << endl;
cout << "U określono jako double \n";
dlatego tutaj raz mamy 28 a raz 28.2609 bo poprostu raz zwraca intigera a raz double.