คำถามติดแท็ก template-specialization

6
เทมเพลตฟังก์ชัน C ++ เฉพาะบางส่วน?
ฉันรู้ว่าโค้ดด้านล่างนี้เป็นความเชี่ยวชาญเฉพาะบางส่วนของคลาส: template <typename T1, typename T2> class MyClass { … }; // partial specialization: both template parameters have same type template <typename T> class MyClass<T,T> { … }; นอกจากนี้ฉันรู้ว่า C ++ ไม่อนุญาตความเชี่ยวชาญเฉพาะบางส่วนของเทมเพลตฟังก์ชัน (อนุญาตให้ใช้แบบเต็มเท่านั้น) แต่รหัสของฉันหมายความว่าฉันมีความเชี่ยวชาญเฉพาะบางส่วนของเทมเพลตฟังก์ชันสำหรับอาร์กิวเมนต์ประเภทเดียว / ประเภทเดียวกันหรือไม่ เพราะมันใช้งานได้กับ Microsoft Visual Studio 2010 Express! ถ้าไม่คุณช่วยอธิบายแนวคิดความเชี่ยวชาญเฉพาะบางส่วนได้ไหม #include <iostream> using std::cin; using std::cout; using …

4
เหตุใดเทมเพลตฟังก์ชันจึงไม่สามารถใช้เฉพาะบางส่วนได้
ฉันทราบว่าข้อกำหนดภาษาห้ามมิให้มีความเชี่ยวชาญเฉพาะบางส่วนของเทมเพลตฟังก์ชัน ฉันต้องการทราบเหตุผลว่าทำไมจึงห้าม? พวกเขาไม่มีประโยชน์? template<typename T, typename U> void f() {} //allowed! template<> void f<int, char>() {} //allowed! template<typename T> void f<char, T>() {} //not allowed! template<typename T> void f<T, int>() {} //not allowed!

1
เสียงดังกราวถูกต้องหรือไม่ในการปฏิเสธรหัสที่คลาสที่ซ้อนกันของแม่แบบคลาสนั้นถูกกำหนดผ่านความเชี่ยวชาญเฉพาะทางหรือไม่
รับแม่แบบชั้นเรียนต่อไปนี้: template<typename T> struct Outer { struct Inner; auto f(Inner) -> void; }; เรากำหนดInnerแยกต่างหากสำหรับแต่ละความเชี่ยวชาญของOuter: template<> struct Outer<int>::Inner {}; template<> struct Outer<double>::Inner {}; จากนั้นกำหนดฟังก์ชันสมาชิกfหนึ่งครั้งสำหรับความเชี่ยวชาญพิเศษทั้งหมดของOuter: auto Outer<T>::f(Inner) -> void { } แต่เสียงดังกราว (9.0.0) บ่น: error: variable has incomplete type 'Outer::Inner' auto Outer<T>::f(Inner) -> void ^ เราสามารถหลบเลี่ยงข้อผิดพลาดของคอมไพเลอร์โดยให้คำจำกัดความของInnerความเชี่ยวชาญอื่น ๆ ของOuter: template<typename T> struct Outer<T>::Inner …

1
เสียงดังกราว / gcc ในความเชี่ยวชาญเฉพาะทางของชั้นเรียน
ฉันเจอปัญหานี้ในขณะที่พยายามชำนาญtuple_size/ tuple_elementสำหรับคลาสที่กำหนดเองใน C ++ 17 สำหรับการโยงโครงสร้าง โค้ดด้านล่างรวบรวมใน GCC แต่ไม่ใช่ในเสียงดังกราว (ทั้งรุ่นลำตัวดูที่ลิงค์ด้านล่าง) #include <type_traits> template<typename T, typename... Ts> using sfinae_t = T; template<typename T, bool... Bs> using sfinae_v_t = sfinae_t<T, typename std::enable_if<Bs>::type...>; template <typename T> struct Test; template <typename T> struct Test<sfinae_v_t<T, std::is_integral_v<T>>> {}; void f() { Test<int> t; } https://godbolt.org/z/ztuRSq นี่คือข้อผิดพลาดที่จัดทำโดยเสียงดังกราว: …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.