選特化還是過載

2021-04-18 06:53:06 字數 663 閱讀 1050

乙個函式模板即有特化版又有過載版,編譯器會選哪個?

以下**來自:

為什麼不要特化函式模版 的例3

1#include 

<

iostream

>23

using

namespace

std;45

template

<

class

t>

6void

f(t)710

11template

<>

12void

f(int*)

1316

17template

<

class

t>

18void

f(t*)19

2223

intmain()

2430

**中的f(int*)呼叫有兩個選擇,一是特化版,另乙個是過載版。

結果是編譯器選了過載版:overload of base template.

(與我的期望相反,我並不想讓指標版為int*例項化,所以辛辛苦苦為int*作了特化,結果編譯器沒理我!)

原因是:編譯器是從所有的過載函式中選擇,而特化不是乙個過載。

這時僅有兩個過載。當選中乙個過載函式模板後,再在該模板的特化版本中選擇。

C Templates 特化與過載

過載函式模板 f生成的過載集包含兩個函式 f int 和f int f生成的過載集包含兩個函式 f int 和f int 呼叫實參 int 0的型別是int 因此,兩次呼叫都會匹配到f int 原則上,下面的模板和它們的例項化體可以在同個程式中同時存在 不過f1 a b 這樣的呼叫就會產生二義性。只...

模板函式 過載 特化

見 12 3456 78910 1112 1314 1516 1718 1920 2122 2324 2526 2728 2930 3132 3334 3536 3738 3940 4142 4344 4546 4748 4950 5152 5354 5556 5758 5960 6162 6364...

巢狀過載以及模板特化

我在用c 實現乙個鏈式棧的時候,想利用其特性實現乙個 簡單 的過載,卻不料這個過載卻是如此的艱辛,我用的是vs2013,編譯器一直出現鏈結錯誤,我檢查了好久,認為沒有錯誤,而其中大有文章。如下 pragma once include include include using namespace s...