2013-03-18 130 views
1

我有以下代碼:C++模板功能

void myfunc() 
{ 
} 
template <typename T> 
void check() 
{ 
} 

template <typename T> 
void checkT (T) 
{ 
    check<T>(); 
} 

所以如果我在主功能checkT(myfunc)那麼編譯一個電話,但如果我有check<myfunc>()不起作用雖然它直接調用第一版。你能解釋一下爲什麼是這樣嗎?錯誤是

error: no matching function for call to 'check()'

謝謝!

+0

爲了把事情說清楚,給我們你解釋什麼是一個例子。 – 0x499602D2 2013-03-18 01:37:16

回答

3

這是因爲myfunc是一個值表達式,而不是一個類型。你可以做

check<decltype(myfunc)>(); 

雖然,或等價:

check<void(void)>(); 

看到它住在http://liveworkspace.org/code/2ANEre$0


PS。在回覆評論時,我感覺到函數形式參數和模板類型參數之間有點混淆。請通過書面形式更明確:

template <typename T> 
void checkT (T somevalue) 
{ 
    check<T>(); // note: somevalue is never used! 
} 
+0

謝謝!這工作。但我的問題是,爲什麼它在我調用'checkT(myfunc)'時調用'check ()'? – 2013-03-18 01:45:08

+0

因爲它傳遞了'T',它是參數的_type_,***不是***的值(作爲模板_type_參數) – sehe 2013-03-18 01:46:08

+0

我試圖在答案中澄清,似乎是什麼來源你的困惑 – sehe 2013-03-18 01:48:49

1

在一審checkT(myfunc)它能夠推斷出類型,checkT真的等同於checkT(T value)等你傳遞valueT被推斷。在第二種情況下,你不提供,你可以改變它像一個類型,這樣的工作:

check<decltype(myfunc)>() ; 

你實際上是提供一個value你需要在這種情況下void(void)一個type

0

checkT(myfunc)因爲myfunc是一個值。但是第二個失敗,因爲它不是模板參數需要的類型。例如,

void checkT(T) 

相同

void checkT(T t) 

這樣就意味着傳遞函數是T類型的對象。也就是說,t是對象,而T是類型。在check的模板參數中,它需要明確指定類型,而不是對象。所以傳入一個對象會引發編譯錯誤。就像傳遞數字5,其中顯式類型int預計。

您可以通過在decltype表達其包裝使用它作爲一個類型:

check<decltype(myfunc)>(); 
// ^^^^^^^^^^^^^^^^