我正試圖尋找一個替代下面的困境。你知道如何當你有一個默認的模板參數的模板類/函數,但你將不得不應用尖括號,即使它們是空的?這是我嘗試修復。我知道我可以使用簡單的typedef
(typedef 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’
有趣的是,他的代碼如何使用這個事實......'X <>'出現在'using'行中。 – 2013-05-09 20:47:40
但是,如果它是一個typedef'd模板,那麼L將工作得很好。這是爲什麼? – 2013-05-10 00:23:55
@ZanLynx區分不在'typedef'和'using'之間,它在模板和類型之間。你當然也可以說'使用L = X <>;'。 – 2013-05-10 01:07:06