Тема: шаблоний класс з дружньою функцією перезавантаженного оператора
Всім привіт, вивчаю С++, для вправи вирішив написати клас який реалізує роботу "стеку". Зіткнувся з такою проблемою. Якщо я залишаю все як є, але прибираю шаблоний тип uniVar(замість нього вказую char) все працює. Якщо я прибираю дружні функції і залишаю шаблоний тип uniVar також все працює. Але якщо я використовую і те і інше в мене виникає помилка яку усунути я не знаю як. Допоможіть студенту у вивчені C++ 
 
#include <iostream>
#define STEK_SIZE 512
using namespace std;
template <typename uniVar>
class stek{
private:
    uniVar st[STEK_SIZE];
    int pos;
public:
    bool operator << (uniVar &val){
        if(pos+1 < STEK_SIZE){
            st[++pos] = val;
            return true;
        }else{
            return false;
        }
    }
    bool operator >> (uniVar &val){
        if(pos > -1){
            val = st[pos--];
            return true;
        }else{
            return false;
        }
    }
    
    friend bool operator << (uniVar &val, stek &ob);
    friend bool operator >> (uniVar &val, stek &ob);
    stek(){
        pos = -1;    
    }
};
bool operator >> (uniVar &val, stek &ob){
        if(ob.pos+1 < STEK_SIZE){
            ob.st[++ob.pos] = val;
            return true;
        }else{
            return false;
        }
}
bool operator << (uniVar &val, stek &ob){
        if(ob.pos > -1){
            val = ob.st[ob.pos--];
            return true;
        }else{
            return false;
        }
}
int main(){
char sym;    
char buffer[] = "hello world";
    stek<char> Stek;
    Stek << buffer[10];
    Stek << buffer[9];
    Stek << buffer[8];
    Stek << buffer[7];
    Stek << buffer[6];
    Stek << buffer[5];
    Stek << buffer[4];
    Stek << buffer[3];
    Stek << buffer[2];
    buffer[1] >> Stek;
    buffer[0] >> Stek;
    while(Stek >> sym){
        cout << sym;
    }
    cout << endl;
    cout << "C++ work" << endl;
    return 0;
}