2013-05-09 69 views
2

我正試圖尋找一個替代下面的困境。你知道如何當你有一個默認的模板參數的模板類/函數,但你將不得不應用尖括號,即使它們是空的?這是我嘗試修復。我知道我可以使用簡單的typedeftypedef X<> L),但我不想使用不同的名稱來引用該類。爲什麼default-template參數不能使用聲明?

所以我嘗試了以下。但由於某些原因,即使我爲模板參數提供了一個類型,它仍然不起作用。這是爲什麼?

#include <type_traits> 

template <typename = void> struct X {}; 

template <typename T = void> 
using L = typename std::conditional< 
       std::is_void<T>::value, 
       X<>, 
       X<T> 
>::type; 

int main() 
{ 
    L l; 
} 

錯誤:

prog.cpp: In function ‘int main()’:
prog.cpp:10:7: error: missing template arguments before ‘l’
prog.cpp:10:7: error: expected ‘;’ before ‘l’

回答

4

的語法是一樣的,對於其他類型的模板:你需要甚至默認模板提供的空模板支架:

L<> l; 

using聲明實際上是多餘的,因爲它裏面的conditional什麼都不做 - 你可以將其刪除,產生template <typename T = void> using L = X<T>; - 顯然不是你想要的。

而事情就是這樣:沒有辦法解決這個問題。類型模板與類型不同(也有很好的理由!),並且你不能將後者當成前者 - 你必須實例化模板來獲取類型。

+0

有趣的是,他的代碼如何使用這個事實......'X <>'出現在'using'行中。 – 2013-05-09 20:47:40

+0

但是,如果它是一個typedef'd模板,那麼L將工作得很好。這是爲什麼? – 2013-05-10 00:23:55

+0

@ZanLynx區分不在'typedef'和'using'之間,它在模板和類型之間。你當然也可以說'使用L = X <>;'。 – 2013-05-10 01:07:06

相關問題