类模板中,类内声明,类外实现:
#include<iostream>
#include<string>
using namespace std;
template<class T1, class T2>
class Demo {
public:
Demo(T1 v, T2 a);
void show();
private:
T1 var;
T2 arg;
};
template<class T1, class T2>
Demo<T1, T2>::Demo(T1 v, T2 a) {
this->var = v;
this->arg = a;
}
template<class T1, class T2>
void Demo<T1, T2>::show() { // 即使未用到,也需要声明模板的参数列表。
cout << "Var:" << this->var << "\nArg:" << this->arg << endl;
}
int main() {
Demo<string, int> d("demo", 21);
d.show();
}
全局函数做友元函数,且在类内实现:
#include<iostream>
#include<string>
using namespace std;
template<class T1, class T2>
class Demo {
friend void show(Demo<T1, T2> d) {
cout << "Var:" << d.var << "\nArg:" << d.arg << endl;
}
public:
Demo(T1 v, T2 a) {
this->var = v;
this->arg = a;
};
private:
T1 var;
T2 arg;
};
int main() {
Demo<string, int> d("demo", 21);
show(d);
}
全局函数做友元,且在类外实现:
#include<iostream>
#include<string>
using namespace std;
template<class T1, class T2>
class Demo; // 需提前声明相关的类
template<class T1, class T2>
void show(Demo<T1, T2> d) {
cout << "Var:" << d.var << "\nArg:" << d.arg << endl;
}
template<class T1, class T2>
class Demo {
friend void show<>(Demo<T1, T2> d);
public:
Demo(T1 v, T2 a) {
this->var = v;
this->arg = a;
}
private:
T1 var;
T2 arg;
};
int main() {
Demo<string, int> d("demo", 21);
show(d);
}