這是一個專業化?
回答
專業化程序本身可以有模板參數。具有模板參數的專業化稱爲部分專業化。
template<class T>
struct rank { ...1 };
rank<T>
裝置是一個類,並且除非另有規定,...1
是類的定義。
template<class U, size_t N>
struct rank<U[N]> { ...2 };
是「另有規定」:這意味着,如果在rank<T>
的T
可以爲某種類型的U
和一些恆定N
被寫爲U[N]
,然後...2
是類的定義。
你可以使用它,如rank<int[2]>
,它將使用第二類定義U = int
和N = 2
。
我會接受這個答案,因爲它糾正了它的兩個前輩,並給出了第一個正確的見解 –
這不是錯誤,因爲它是有效的。
[C++11: 14.5.5/1]:
主類模板聲明是其中類模板名稱是標識符的聲明。類模板名稱爲simple-template-id的模板聲明是在simple-template-id中命名的類模板的部分特化。當特化中的參數與部分特化(14.5.5.1)中給出的參數相匹配時,類模板的部分特化提供了替代主模板的替代定義。 [..]
有根本沒有規則,禁止它,事實上,該標準包含正是這種情況的一個例子:
[C++11: 14.5.5/3]:
[示例:template<class T1, class T2, int I> class A { }; // #1 template<class T, int I> class A<T, T*, I> { }; // #2 template<class T1, class T2, int I> class A<T1*, T2, I> { }; // #3 template<class T> class A<int, T*, 5> { }; // #4 template<class T1, class T2, int I> class A<T1, T2*, I> { }; // #5
第一個聲明聲明瞭主(非特殊化)類模板。第二個和隨後的聲明聲明主模板的部分特化。末端示例]
是即使勉強相關的唯一限制是,諷刺的是,接近(雖然不是精確的),你所聲稱的相反:
[C++11: 14.5.5/8]:
中的參數進行類模板部分專業化清單,適用以下限制:
- [..]
- 專業化的參數列表不應與主模板的隱式參數列表相同。
- [..]
你會使用主模板和部分特化,像這樣:
int main()
{
rank<char> a; // uses the primary
rank<int[5]> b; // uses the partial spec.
}
引用規範的舷梯。永遠有一個權威的參考,即使是一個稍微難以理解的參考:-) –
- 1. 這些函數是列專業還是行專業?
- 2. C#專業化
- 3. 子類作爲專業化 - 即:在專業化添加一個方法
- 4. C++模板成員專業化 - 這是一個編譯器限制嗎?
- 5. 這是在這個OO設計方案中專業化的正確方法嗎?
- 6. 模板專業化
- 7. 模板專業化
- 8. 模板專業化
- 9. 功能專業化
- 10. 模板專業化
- 11. 模板專業化
- 12. 模板專業化
- 13. 選擇專業化
- 14. 模板專業化
- 15. 專業化與多元化
- 16. 什麼時候是一個類型相等(模板專業化)?
- 17. C++模板專業化:編譯錯誤:「不是一個類型」
- 18. 存儲類是不允許在一個明確的專業化
- 19. 專業化本身就是一個模板
- 20. 模板專業化是一個特定的模板
- 21. 混合顯式專業化和非專業化模板
- 22. 混合顯式類專業化和類方法專業化?
- 23. 查詢C++模板專業化和部分模板專業化
- 24. 這是否完全模仿功能模板專業化?
- 25. 就是專業化和重載
- 26. C++專業化,type_of或只是typeid
- 27. 這個條件如何被放入模板部分專業化?
- 28. 這本書「專業Javascript設計模式」 - 這是一個壞主意嗎?
- 29. 模板專業化與另一模板
- 30. 專業化使用多個typenames
這不是一個特例,只是一個模板聲明。 –
@πάνταῥεῖ呃...什麼?這是一個專業化。您不能擁有多個具有相同名稱的不同模板類,並且代碼不會嘗試這樣做。 – hvd
@doc GCC 4.8.3不給出這樣的錯誤,假設添加了缺失的分號並且包含''以使'size_t'可用。 –
hvd