คำถามติดแท็ก templates

เทมเพลตแท็กใช้ในหลายบริบท: การเขียนโปรแกรมทั่วไป (โดยเฉพาะ C ++) และการสร้างข้อมูล / เอกสารโดยใช้เทมเพลตเอนจิ้น เมื่อใช้แท็กนี้กับคำถามที่มีการใช้งานหนัก - ติดแท็กรหัสภาษาที่มีการใช้งาน

2
C ++ - เหตุใดจึงต้องใช้คำหลัก 'เทมเพลต' ที่นี่
ฉันมีรหัสต่อไปนี้: template <typename TC> class C { struct S { template <typename TS> void fun() const {} }; void f(const S& s) { s.fun<int>(); } }; // Dummy main function int main() { return 0; } เมื่อมีการสร้างนี้มีทั้ง GCC 9.2 และเสียงดังกราว (9.0) ฉันได้รับการรวบรวมข้อผิดพลาดเนื่องจากการคำหลักที่ถูกต้องสำหรับการกล่าวอ้างtemplate funเสียงดังกราวแสดง: error: use 'template' keyword to treat 'fun' …

1
ผ่านตัวชี้ฟังก์ชั่นจากอาร์เรย์ของตัวชี้ฟังก์ชั่นเป็นอาร์กิวเมนต์แม่แบบ
ฉันต้องการผ่านตัวชี้ฟังก์ชั่นจากอาร์เรย์ของตัวชี้ฟังก์ชั่นเป็นอาร์กิวเมนต์แม่แบบ รหัสของฉันดูเหมือนว่าจะรวบรวมโดยใช้ MSVC แม้ว่า Intellisense บ่นว่ามีบางอย่างผิดปกติ ทั้ง gcc และ clang ไม่สามารถคอมไพล์โค้ดได้ ลองพิจารณาตัวอย่างต่อไปนี้: static void test() {} using FunctionPointer = void(*)(); static constexpr FunctionPointer functions[] = { test }; template <FunctionPointer function> static void wrapper_function() { function(); } int main() { test(); // OK functions[0](); // OK wrapper_function<test>(); // OK wrapper_function<functions[0]>(); …
9 c++  templates  c++14 

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 นี่คือข้อผิดพลาดที่จัดทำโดยเสียงดังกราว: …

5
วิธีคืนข้อมูลประเภทที่ถูกต้องในแม่แบบ?
#include <iostream> using namespace std; template <class X, class Y> Y big(X a, Y b) { if (a > b) return (a); else return (b); } int main() { cout << big(32.8, 9); } นี่ฉันกำลังใช้แม่แบบใน CPP ดังนั้นเมื่อผมเรียกใช้ฟังก์ชันbigผ่านการขัดแย้งของdoubleและประเภทผมต้องการคำตอบกลับมาซึ่งเป็นint doubleประเภทของที่นี่ก็จะส่งกลับแทน3232.8 ฉันจะได้รับผลลัพธ์ที่ต้องการได้อย่างไร จะเขียนbigฟังก์ชั่นการส่งคืนที่เหมาะสมได้อย่างไร?

1
พยายามทำความเข้าใจแม่แบบและค้นหาชื่อ
ฉันพยายามเข้าใจตัวอย่างโค้ดต่อไปนี้ ตัวอย่าง # 1 template <typename T> struct A { static constexpr int VB = T::VD; }; struct B : A<B> { }; ไม่ว่าจะเป็น gcc9 หรือ clang9 ข้อผิดพลาดที่นี่ ถามทำไมรหัสนี้ถึงคอมไพล์? เราไม่ได้ยกตัวอย่างA<B>เมื่อได้รับมรดกจาก B? ไม่มี VD ใน B ดังนั้นคอมไพเลอร์ไม่ควรโยนข้อผิดพลาดที่นี่หรือ ตัวอย่าง # 2 template <typename T> struct A { static constexpr auto AB = …


2
ทำไม C ++ deduce T ในการโทรไปยัง Foo <T> :: Foo (T&&) ไม่ได้?
รับโครงสร้างแม่แบบต่อไปนี้: template&lt;typename T&gt; struct Foo { Foo(T&amp;&amp;) {} }; การคอมไพล์นี้และTถูกอนุมานว่าเป็นint: auto f = Foo(2); แต่สิ่งนี้ไม่ได้รวบรวม: https://godbolt.org/z/hAA9TE int x = 2; auto f = Foo(x); /* &lt;source&gt;:12:15: error: no viable constructor or deduction guide for deduction of template arguments of 'Foo' auto f = Foo(x); ^ &lt;source&gt;:7:5: note: candidate function [with …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.