почему шаблон вычет аргумент не работает здесь?


я создал два простых функций, которые вам параметров шаблона и пустые структуры определение типа:

//s<t>::type results in t&template <class t>struct s{    typedef typename t& type;};//example 1: get one parameter by reference and return it by valuetemplate <class a>atemp(typename s<a>::type a1){    return a1;}//example 2: get two parameters by reference, perform the sum and return ittemplate <class a, class b>btemp2(typename s<a>::type a1, b a2)//typename struct s<b>::type a2){    return a1 + a2;}

тип аргумента применяется на struct s, чтобы получить ссылку. я называю их с некоторые целочисленные значения, но компилятор не может вывести аргументы:

int main(){    char c=6;    int d=7;    int res = temp(c);    int res2 = temp2(d,7);}

error 1 error c2783: 'a temp(s::type)' : could not deduce template argument for 'a'

error 2 error c2783: 'b temp2(s::type,b)' : could not deduce template argument for 'a'

charint

почему это происходит? это что трудно увидеть, что аргументы шаблона и значений?