The cause of this is that template argument deduction for functions does not work when the arguments are in different positions in the parameter list for the two function calls. In the first example, the key type is std::string and the value type is int, so the template argument deduction can correctly determine that T is std::string and U is int. In the second example, the key type is int and the value type is std::string, so the deduction fails because the types are in a different order.

To fix this, you can explicitly specify the template arguments for the function call:

```c++
int key2 = getkey<int, std::string>(map2, "apple");
```

Alternatively, you can rearrange the order of the template parameters in the function definition to match the order of the types in the map:

```c++
template<typename T, typename U>
T getkey(const std::map<T, U>& m, const U& value) {
// ...
}
```

With this definition, both calls to the function will work without explicit template argument specification.
สาเหตุนี้คือการลดอาร์กิวเมนต์เทมเพลตสำหรับฟังก์ชันไม่ทำงานเมื่ออาร์กิวเมนต์อยู่ในตำแหน่งที่แตกต่างกันในรายการพารามิเตอร์สำหรับการเรียกฟังก์ชันทั้งสอง ในตัวอย่างแรก ประเภทคีย์คือ std::string และประเภทค่าคือ int ดังนั้นการหักล้างอาร์กิวเมนต์เทมเพลตจึงสามารถระบุได้อย่างถูกต้องว่า T คือ std::string และ U คือ int ในตัวอย่างที่สอง ประเภทคีย์คือ int และประเภทค่าคือ std::string ดังนั้นการหักเงินจึงล้มเหลวเนื่องจากประเภทอยู่ในลำดับที่แตกต่างกัน เพื่อแก้ไขปัญหานี้ คุณสามารถระบุอาร์กิวเมนต์เทมเพลตสำหรับการเรียกใช้ฟังก์ชันได้อย่างชัดเจน: ```c++ int key2 = getkey<int, std::string>(map2, "apple"); ``` หรือคุณสามารถจัดเรียงลำดับของพารามิเตอร์เทมเพลตใหม่ในคำจำกัดความของฟังก์ชันเพื่อให้ตรงกับลำดับของประเภทในแผนที่: ```เทมเพลต c++<typename T, typename U> T getkey(const std::map< T, U>& m, const U& value) { // ... } ``` ด้วยคำจำกัดความนี้ การเรียกฟังก์ชันทั้งสองจะทำงานโดยไม่มีข้อกำหนดอาร์กิวเมนต์เทมเพลตที่ชัดเจน
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence