《Effective C++》讀書筆記之item46:需要類型轉換時請為模板定義非成員函數

來源:互聯網
上載者:User

1.在類外定義的模板函數,在實參具現化時不進行隱式類型轉換:可以在函數調用過程中進行這樣的轉換,但是在能夠調用一個函數之前,編譯器必須知道那個函數存在,而為了知道它,必須先為相關的函數模板具現化參數類型。這是template C++與物件導向的C++不同的地方。

對條款24中的例子進行模板化:

template<typename T>class Rational{public:Rational(const T& numerator = 0, const T& denominator = 1);//傳引用const T numerator() const;const T denominator() const; //傳值,並且是const...};template<typename T>const Rational<T> operator*(const Rational<T>& lhs, const Rational<T>& rhs){...}//在類外定義函數重載操作符,條款20有詳細說明Rational<int> oneHalf(1, 2);Rational<int> result = onehalf * 2;//錯誤,不能通過編譯!無法確知第二個參數的具體類型,因而無法進行隱式類型轉換

對於這個例子而言,第一個參數是一個模板類產生的對象,可以在模板類中定義這個重載函數,這樣在第一個對象具現化時,能夠將該模板函數也具現化,編譯器得知第二個參數的類型,從而可以完成隱式類型轉換。可以將operator*聲明為友元函數:

template<typename T>class Rational{public:friend const Rational operator*(const Rational& lhs, const Rational& rhs);//聲明為友元函數,但不在類內定義,從而連接器無法找到該函數定義...};template<typename T>const Rational<T> operator*(const Rational<T>& lhs, const Rational<T>& rhs)//定義。不能通過串連!{...}

這裡,同樣的代碼能夠通過編譯,但是不能通過串連,解決方案有二:

(1)將定義式放到類內,作為一個內嵌函式:

template<typename T>class Rational{public:friend const Rational operator*(const Rational& lhs, const Rational& rhs){return Rational(lhs.numberator() * rhs.numerator(), lhs.denominator() * rhs.denominator());}...};

(2)在類外聲明並定義一個輔助的函數模板完成實際工作,在類內用函數模板調用:

template<typename T> class Rational;//前向聲明template<typename T> const Rational<T> doMultiply(const Rational<T>& lhs, const Rational<T>& rhs)//許多編譯器要求模板定義式必須在標頭檔內{...}template<typename T>class Rational{public:friend const Rational operator*(const Rational& lhs, const Rational& rhs){return doMultiply(lhs, rhs);}...};

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.