相信很多人都碰到友元運算符重載函數(shù)的泛型模板編譯不通過的情況
template <typename T>
class Demo
{
//友元運算符重載函數(shù)的泛型模板寫法
friend Demo operator>> <T> (const Demo &obj, T t);
public:
Demo(T t) {
this->t = t;
}
private:
T t;
public:
T getT() {
return this->t;
}
};
//對應(yīng)友元運算符重載函數(shù)的泛型模板寫法
template <typename T>
Demo<T> operator>>(const Demo<T> &obj, T t) {
Demo<T> temp(obj.t + t);
return temp;
}
int main() {
Demo<int> d(4);
Demo<int> d2 = d >> 1;
cout << d2.getT() << endl;
return 0;
}
因為編譯器并不是把函數(shù)模板處理成能夠處理任意類的函數(shù);編譯器從函數(shù)模板通過具體類型產(chǎn)生不同的函數(shù)常熙;編譯器會對函數(shù)模板進行兩次編譯:在聲明的地方對模板代碼本身進行編譯娩贷,在調(diào)用的地方對參數(shù)替換后的代碼進行編譯第晰。
//友元運算符重載函數(shù)的泛型模板寫法
friend Demo operator>> <T> (const Demo &obj, T t);
//對應(yīng)友元運算符重載函數(shù)的泛型模板寫法
template <typename T>
Demo<T> operator>>(const Demo<T> &obj, T t) {
Demo<T> temp(obj.t + t);
return temp;
}