2012-04-24 52 views
5

在以下代碼中,主功能使用普通功能而不是模板功能。正常功能和模板功能之間的優先級

#include <iostream> 

using namespace std; 

template <class T> 
void num(T t){cout<<"T : "<<t;} 

void num(int a){cout<<"wT : "<<a;} 


int main() 
{ 
    num(5); 
    return 0; 
} 

背後有什麼可能的原因?

+2

功能最佳匹配論點首先被選中。 – Anycorn 2012-04-24 03:39:20

+0

@Anycorn:在C++中,默認選擇第一個正常的函數嗎? – IndieProgrammer 2012-04-24 03:43:52

+0

讓我澄清 - 如果一個正常的函數匹配*類型*,它將被選中。例如,如果它是'num(char a)',則會選擇temlate。 – Anycorn 2012-04-24 03:48:07

回答

4

要在這種情況下調用模板方法,您需要明確調用方法num<int>(5)而不是num(5)。儘管編譯器可以推斷,但非泛型方法優於通用方法。你可以在這裏看看這個行爲http://ideone.com/ccDJP

+0

感謝。我希望聽到這種說法「雖然編譯器可以推斷,它會更喜歡非泛型方法泛型一個」。 – IndieProgrammer 2012-04-24 03:46:03

+0

是的,如果你想想看,使用非通用的原因在文本中創建一個新的模板方法(C++模板基本上覆制了所用的每不同類型的方法)。爲什麼要通過努力,如果有一個已經:) – 2012-04-24 03:47:30

+0

替代的方式來調用模板變種'NUM <>(5);'。 – legends2k 2014-06-18 15:25:29

7

看看香草薩特的優秀文章"Why not specialize function templates?"

引述:

「最後,讓我們只專注於函數模板,並考慮超載規則,看看哪些被調用在不同情況下的規則。是相當簡單的,至少在一個較高的水平,並且可以表示爲一個典型的兩班制:

  1. 非模板函數是一等公民。一個與參數類型匹配的普通的舊模板函數以及任何函數模板都將通過其他函數模板進行選擇。

  2. 如果沒有一流的公民可以選擇至少一樣好,那麼函數庫模板作爲第二級公民接下來會被諮詢。哪一個函數庫模板被選擇取決於哪一個匹配最好,並且是「最專業的」(重要的注意:這種「專業化」的用法足夠奇怪地與模板專業化無關;它只是一個不幸的口語)根據一組公平的奧術規則:

    • 如果很清楚,有一個「最專業的」功能庫模板,那麼就可以使用該模板。如果該基礎模板碰巧專用於正在使用的類型,則將使用專業化,否則將使用使用正確類型實例化的基礎模板。

    • 否則,如果「最專業的」功能庫模板存在匹配關係,則調用不明確,因爲編譯器無法確定哪個匹配更好。程序員將不得不做一些事情來限定呼叫並說出哪一個是想要的。

    • 否則,如果有可以進行符合無功能基礎模板,通話不好,程序員必須解決的代碼。」

在你的代碼示例,如由David Z.指出,非模板功能void num(int a)將被選中,因爲它是在第一條規則匹配。任何額外函數模板將只考慮他們是否有更好的匹配