首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 模板友元函式解決隱式轉換與模板參數推導問題

     編輯:關於C++

問題

模板類別 Rational<T> 的非成員 operator* 若為模板函式,編譯器無法從 int 或 double 推導出 T,導致隱式轉換失效。

解決:友元模板函式

在類別內宣告友元函式模板,使其與類別模板參數 T 綁定,實例化時自動產生對應 T 的非模板函式,支援隱式轉換。

程式碼架構

template<typename T> class Rational;
template<typename T>
const Rational<T> doMultiply(const Rational<T>&, const Rational<T>&); // 前置宣告

template<typename T>
class Rational {
    // ...
    friend const Rational<T> doMultiply<T>(const Rational<T>&, const Rational<T>&);
};

template<typename T>
const Rational<T> doMultiply(const Rational<T>& lhs, const Rational<T>& rhs) {
    return Rational<T>(lhs.numerator()*rhs.numerator(),
                       lhs.denominator()*rhs.denominator());
}

template<typename T>
const Rational<T> operator*(const Rational<T>& lhs, const Rational<T>& rhs) {
    return doMultiply(lhs, rhs); // 呼叫友元實作
}

兩種實作方式

  1. 友元函式內直接定義(隱式 inline)。
  2. 友元函式僅宣告,外部定義模板函式 doMultiply(如上)。

注意

友元模板函式會隨類別模板具現化而自動具現化,解決參數推導與隱式轉換雙重問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved