2013-04-25 90 views
1

我寫了下面的代碼:傳遞指針類型的模板參數

template <typename T> 
void myname(T* x) 
{ 
    cout<<"x is "<<x; 
} 

,我調用:

char *p="stackOverflow"; 
myname(p); 

它打印stackOverflow

但是,如果我將模板參數從(T* x)更改爲(T x),我會得到相同的結果。

那麼兩個模板參數有什麼區別?

void myname (T x) 

void myname (T* x) 

回答

1

第一種情況 - T推導爲char,所以T*char*。 第二種情況 - T推導爲char*。這裏 差異是在調用該功能

對於第一種情況應該是

myname<char>(p); 

和第二

myname<char*>(p); 

此外,差異將是,當你在函數中使用類型T

+0

Excelletanswer。如果是這種情況,如何傳遞像char **這樣的雙指針? – Whoami 2013-04-25 11:35:27

+0

@Whoami你是什麼意思?第一種情況使用T **,第二次使用T,第三種情況使用T *。打電話像'myname(&p)'; – ForEveR 2013-04-25 11:42:33

+0

明白了吧)。多謝,夥計。 – Whoami 2013-04-25 11:45:37

1

當您在功能與此

template <typename T> 
void myname(T x) 
{ 
    cout<<"x is "<<x; 
    T t;     // This is char* now 
} 

+0

好用例命名! :) – Whoami 2013-04-25 11:36:24

1

在這兩種情況下,使用T

char *p="stackOverflow"; 
myname(p); 

template <typename T> 
void myname(T* x) 
{ 
    cout<<"x is "<<x; 
    T t;     // This is char now 
} 

但是區別將是可見的,編譯器推斷模板參數,生成功能與函數參數類型char *匹配。

在第一種情況下,它使用T = char實例化模板,給出void myname<char>(char* x)

在第二種情況下,它將T = char*實例化爲void myname<char*>(char* x)

另外,請注意,字符串文字是常量,您不應該指向一個非const指針。

相關問題