template<typename T1, size_t SIZE>
void foo(std::vector<std::array<T1, SIZE>> bar) {
std::cout << "SPECIFIC (array)" << std::endl;
}
คุณควรใช้แทน
std::size_t
ทำงานที่นี่int
แก้ไข:
จริงๆแล้วความคิดเห็นและปรีชาญาณของฉันเกี่ยวกับรหัสทำให้ฉันขุดลงในหัวข้อ ได้อย่างรวดเร็วก่อนผู้พัฒนามาตรฐาน (เช่นฉัน) คาดว่าคอมไพเลอร์จะแปลงint
เป็นstd::size_t
(เพราะทั้งสองประเภทที่สมบูรณ์และการแปลงโดยปริยายเป็นเรื่องเล็กน้อยมาก) และเลือกvoid foo(std::vector<std::array<T1, SIZE>> bar)
เป็นผู้เชี่ยวชาญที่ดีที่สุด ดังนั้นในขณะที่อ่านหน้าการหักอาร์กิวเมนต์ของแม่แบบฉันพบสิ่งนี้
หากใช้พารามิเตอร์เท็มเพลตที่ไม่ใช่ชนิดในรายการพารามิเตอร์และอาร์กิวเมนต์เท็มเพลตที่สอดคล้องกันนั้นถูกอนุมานประเภทของอาร์กิวเมนต์เท็มเพลตที่อนุมานได้ (ตามที่ระบุในรายการพารามิเตอร์เทมเพลตที่ปิดล้อมหมายความว่าการอ้างอิงจะถูกสงวนไว้) ต้องตรงกับประเภทของ พารามิเตอร์เท็มเพลตที่ไม่ใช่ประเภทแน่นอนยกเว้นว่า cv-qualifiers ถูกดร็อปและยกเว้นว่าอาร์กิวเมนต์เท็มเพลตถูกอนุมานจากอาเรย์ที่ถูกผูกไว้ - ในกรณีนั้นอนุญาตให้ใช้ประเภทอินทิกรัลชนิดใดก็ได้แม้แต่บูลแม้ว่ามันจะเป็นจริงเสมอ:
แน่นอนเช่นเคยคุณต้องอ่านสองสามครั้งมากกว่าหนึ่งครั้งเพื่อเข้าใจว่ามันแปลว่าอะไร :)
ดังนั้นผลลัพธ์ที่น่าสนใจออกมา
ความเชี่ยวชาญพิเศษที่เราต้องการไม่ได้ถูกเลือก แต่ถ้าคอมไพเลอร์ถูกบังคับให้เลือกมันจะเป็นข้อผิดพลาด
template<typename T1, int SIZE>
void foo(std::vector<std::array<T1, SIZE>> bar) {
std::cout << "SPECIFIC (array)" << std::endl;
}
int main() {
std::vector<std::array<int, 3>> b(2, std::array<int, 3> {4, 5, 6});
foo(b); // P = std::vector<std::array<int,(int)SIZE>
// A = std::vector<std::array<int,(unsigned_long)SIZE>>
// error: deduced non-type template argument does not have the same
// type as its corresponding template argument */
}
เรียกใช้รหัส
อีกสิ่งที่น่าสนใจคือ:
หากอาร์กิวเมนต์เท็มเพลตที่ไม่ใช่ประเภทไม่ได้ถูกอนุมานว่าจะไม่มีข้อ จำกัด ที่บังคับให้อาร์กิวเมนต์และประเภทเทมเพลตเหมือนกัน
#include <vector>
#include <array>
#include <iostream>
template<typename T1, int SIZE>
void foo(std::vector<std::array<T1, SIZE>> bar) {
std::cout << "SPECIFIC (array)" << std::endl;
}
int main() {
std::vector<std::array<int, 3>> b(2, std::array<int, 3> {4, 5, 6});
foo<int,3>(b);
}
เรียกใช้รหัส
vector
ทั้งหมด ดูที่นี่