类模板的类外实现需要友元friend。
一、不需要友元的写法
举个例子,首先我们正常的模板类可以这样写:
template<class T,class T1>
class person {
public:
person(T name, T1 mage) {
this->mNname = name;
this->mage = mage;
}
void print_test() {
cout << this->mNname << this->mage << endl;
}
public:
T mNname;
T1 mage;
};
void test() {
person<string, int> p("wangbadan", 20);
p.print_test();
}
这里指定了两个类型,所有一个T,一个T1,这也是常见的模板类类内写法。但是当我们要编写类外写法时,便可以这样写:
①首先仍是先声明(一个有参构造+一个输出测试函数):
template<class T>
class person{
public:
person(T age,T id); //声明
void print_test();
}
public:
T mAge;
T mID;
};
②类外继承实现,这里注意在继承时一定要指定类型:
template<class T>
person<T>:person(T age,T id){
this->mAge = age;
this->mID = id;
}
template<class T>
void person<T>::print_test(){
cout << mAge << mID << endl;
}
③调用时其实和之前一样:
void test() {
person<int> p(10, 20);
p.print_test();
}
二、友元类外:当我如果不想使用编写的输出函数是,便可以使用重载左移运算符:
①首先仍然是声明:
template<class T>
class person {
public:
//重载左移操作符
template <class T> //这个必须加,要指定是模板类型
friend ostream& operator<<(ostream& os, person<T>& p);
person(T age, T ID);
void print_test();
public:
T mage;
T mid;
};
②输出:
//重载左移运算操作符
template<class T> //与上面的声明相对应
ostream& operator<<(ostream& os, person<T>& p) {
os << p.mage << p.mid << endl;
return os;
}
void test() {
person<int> p(10, 20);
//p.print_test();
cout << p;
}