2013-02-09 32 views
5

(我假設Abrahams/Dimov example的知識,在這個問題上。)函數模板專業化和亞伯拉罕/ Dimov擁有例如

假設存在這樣喜歡這個,你不能修改標題一些第三方的代碼:

template<class T> void f(T); // (1) base template 1 
template<class T> void f(T *); // (2) base template 2 
template<> void f<>(int *);  // (3) specialization of (2) 

的問題是:

如果我一直在考慮上面,是聲明,是有可能我現在專注的基本模板1,其中的情況下T = int *(例如)?

或者僅僅聲明基本模板2意味着基本模板1不能再專用(至少對於指針)?

+0

即使你可以,該專業化是否可以被調用?似乎基本模板2將總是「贏」,如果用指針調用f。 – Mat 2013-02-09 07:51:38

+0

@Mat:據我所知,不是來自當前的翻譯部門,但它可以從另一個翻譯部門調用,我認爲,對嗎?假設另一個翻譯單元有一個非重載聲明#1和相應的專業化。 – Mehrdad 2013-02-09 07:55:14

+0

在範圍內沒有基礎模板2的TU? (不知道我明白了。)還要小心ODR違規行爲。 – Mat 2013-02-09 07:56:36

回答

0

你可以隨時嘗試然後來找我們。但我不明白爲什麼它不起作用。如果T = int*它會工作,你想要的。因此沒有2將是int* *

+1

我搞砸了這個例子嗎?對我來說,似乎專門爲'T = int *'需要與(3)('template <> void f <>(int *);')相同的語法,因此它不可能... – Mehrdad 2013-02-09 07:47:24

+0

@ Mehrdad,你說得很對。它不能被做:)除非你找到一種方法來強制一個特定的過載(你可以利用的功能有一些其他的區別) – 2013-02-09 07:50:04

+0

@Mehrdad我知道了:你可以用'='和隱式轉換'操作符創建一個類'是'int',但是重載了你的函數,這個類需要這個類本身(因此它會選擇一個而不是int類型的) – 2013-02-09 07:55:25

2

的參數可以通過明確指定在尖括號模板參數函數名後(參照C++ 11 - 標準14.7.3)

重載(1)
#include <iostream> 
using namespace std; 
template<class T> void f(T) // (1) base template 1 
{ 
    cout << "template<class T> void f(T)" << endl; 
} 

template<class T> void f(T *) // (2) base template 2 
{ 
    cout << "template<class T> void f(T *)" << endl; 
} 
//template<> void f<>(int *);  // (3) specialization of (2) 

template<> void f<int*>(int *)  // (4) specialization of (1) 
{ 
    cout << "f<int*>(int *)" << endl; 
} 


int main() { 
    int i; 
    f(&i); // calls (2) since only base-templates take part in overload resolution 
    return 0; 
} 
+0

正確,雖然它不是「超載」。這是一個明確的專業化。 – Stephen305 2016-04-13 04:16:58