类模板与友元函数
Demo.h
#pragma once
template <typename T>
class Demo{
public:
Demo(T data = 0);
T getData() const;
//友元函数声明
template <typename T>
friend Demo<T>& AddDemo(const Demo<T>& demo1, const Demo<T>& demo2);
private:
T data;
};
Demo.cpp
#include "Demo.h"
template <typename T>
Demo<T>::Demo(T data){
this->data = data;
}
template<typename T>
T Demo<T>::getData() const{
return data;
}
main.cpp
#include <iostream>
#include <Windows.h>
#include "Demo.cpp" //需要包含类的实现.cpp文件
#include "Demo.h"
using namespace std;
//友元函数实现
template <typename T>
Demo<T>& AddDemo(const Demo<T>& demo1, const Demo<T>& demo2) {
Demo<int> tmp;
tmp.data = demo1.data + demo2.data;
return tmp;
}
int main(void) {
Demo<int> d1(100), d2(200);
Demo<int> tmp;
//友元函数调用
tmp = AddDemo<int>(d1, d2);
cout << tmp.getData() << endl;
system("pause");
return 0;
}
结论:
(1)在类的内部声明友元函数,必须写成以下形式:
template<typename T>
friend A<T> addA (A<T> &a, A<T> &b);
(2)友元函数的实现 必须写成
template<typename T>
A<T> add(A<T> &a, A<T> &b){
//......
}
(3)友元函数调用 必须写成
A<int> c4 = addA<int>(c1, c2);