法一:将实现直接与声明放在一起。
法二:在声明前加template<class T>
法三:operator>><T>
个人认为:
对于法三:类内部声明友元,friend istream& operator>><T>(istream &in,GeneralizedList<T>& L); 实际上是调用类外的已声明并定义过的函数(在类存在之前已经存在的函数),类内的声明实际上是此函数本身的调用,是此函数模板的一个实例化。
friend ostream& operator<<(ostream& output,CirQueue<Type>& cq);意味着是in(输入流对象)用的一个普通函数,但是很明显不是,那么就得用<>就是说<< 后面跟上<>来表示该函数是一个实例。
对于法二:当然我给出的是直接在里面声明该函数本身是一个模板,然后在外面定义即可
类内:template<class T>friend istream& operator>>(istream &in,GeneralizedList<T>& L);
类外:template<class T>friend istream& operator>>(istream &in,GeneralizedList<T>& L){ };
对于法一:毫无歧义;