[英]Using Partial Specialization in C++11
我有以下代碼:
template<class T, int I=44> struct test {T j = I;};
template<int J> struct test<int, J> {int j = J;};
int main()
{
test<55> jj;
std::cout << jj.j << std::endl;
return(1);
}
編譯器(clang)只抱怨行test<55> jj
我不明白為什么? 有工作嗎?
如果它抱怨該行,為什么不抱怨第二個模板定義?
提前致謝。
消息是:
enable.cpp:17:8: error: template argument for template type parameter must be a type
test<55> jj;
^~
enable.cpp:9:16: note: template parameter is declared here
template<class T, int I=44> struct test
問題是您還沒有理解選擇類模板專業化的方式。
你的專長:
template<int J> struct test<int, J> {int j = J;};
不會創建只需傳入單個int模板參數的模板。
test<55> jj; // doesn't work because there's no template<int J> struct test
相反,它所做的是創建template<class T, int I> struct test
,當template<class T, int I> struct test
的模板參數匹配特化時,即test<int,J>
。
test<int,55> jj; // uses the specialization template<int J> struct test<int, J>
這是標准的關鍵引用:
在引用類模板特化的類型名稱中(例如,
A<int, int, 1>
),參數列表應與主模板的模板參數列表匹配。 專門化的模板參數是從主模板的參數推導出來的。 [強調補充]- 14.5.5.1 [temp.class.spec.match] p4
您似乎嘗試將int
設置為T
的默認類型,同時為I
設置獨立的默認值。 我認為您的意圖是能夠指定類型和值,僅指定類型並將44作為默認值,或者僅指定值並將int作為默認類型。
不幸的是,我不知道如何指定這樣的獨立默認值。 您可以指定默認值( template<class T=int, int I=44> struct test
),但獲取默認類型也需要接受默認值。
但是,如果您願意使用第二個名稱,那么您可以:
template <int I>
using test_int = test<int, I>;
這將創建一個模板別名,以便您只需指定一個值:
test_int<55> jj;
這將最終使用任何專門化test<int, I>
碰巧解決是否存在顯式特化或編譯器生成隱式特化。
出現第一個錯誤是因為編譯器嘗試使用55實例化第一個模板參數( class T
)。這不起作用,因為55本身不是一個類型,而是它的實例化。 但是, test<int>
有效,因為模板parater是一個類型,由模板簽名請求。
你想要的只是“currying”類型,又名。 模板別名:
template <typename T>
struct test2 = using test<T, 55>;
在這里你只需要提供一個T
來選擇55作為固定的第二個參數。 但是你仍然需要通過給它一個具體的T
來使用那種類型,例如test2<double>
。
評論表明您也可能對以下變體感興趣:
template <int I>
using test3 = test<int, I>;
在這里,您將第一個類型參數修復為int,這允許您像在代碼中一樣使用它:
test3<55> t;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.