问个非常深沉的有关问题,为什么采用类模板形参类型的友元函数不能在该类中声明?

问个非常深沉的问题,为什么采用类模板形参类型的友元函数不能在该类中声明???
大家看一看,友元函数foo为什么不能在类模板C中声明,为什么使用自己的模板类型就可以声明了。

#include <iostream>
using namespace std;
template <class T>
class C
{
private:
    T m[5];
public:
    friend void foo(const C<T>& t);  //使用类C的形参类型就不可以,为什么捏!
    //template <class U>             //定义自己的形参类型
    //friend void foo(const C<U>& t);//使用自己的形参类型,这样可以
};
 
template <class T>
void foo(const C<T>& t)
{
    for (int i = 0; i < 5; ++i)
    {
        cout << t.m[i] << endl;
    }
}
int main()
{
    C<int> c;
    foo(c);
    getchar();
    return 0;



还有个问题,采用类模板形参的友元函数foo不能在类模板C中声明,但是可以定义,为什么?

#include <iostream>
using namespace std;
template <class T>
class C
{
private:
    T m[5];
public:
    friend void foo(const C<T>& t) //定义就可以使用类C的形参类型了,为什么捏!
    { 
      for (int i = 0; i < 5; ++i)
      {
          cout << t.m[i] << endl;
      }
    }
};
int main()
{
    C<int> c;
    foo(c);
    getchar();
    return 0;



如果能一次回答这两个问题的,高呼吾皇万岁万岁万万岁

------解决方案--------------------
引用:
最后再问一下,如果是两个T,是不是依赖关系就解除了??
嗯,是的,最后给个建议一下,看看友元的作用域及其作用再去理解模板参数,这样理解快些