I apologise for the confusion caused by my earlier response.
The automatic template deduction works in the first example because the type is explicitly specified - `key1` is declared to be of type `std::string`.
The second example fails because the type of the string literal `"apple"` is assumed to be `const char*` by the compiler, which conflicts with `map2`'s type (`std::string`).

The error can be fixed by either explicitly specifying the template's arguments:
```
int key2 = getkey<int, std::string>(map2, "apple");
```
Or by using the std::string literal suffix:
```
using namespace std::string_literals;
int key2 = getkey(map2, "apple"s);
```
ฉันขอโทษสำหรับความสับสนที่เกิดจากการตอบกลับก่อนหน้านี้ของฉัน การหักเทมเพลตอัตโนมัติทำงานในตัวอย่างแรกเนื่องจากมีการระบุประเภทไว้อย่างชัดเจน - `key1` ได้รับการประกาศให้เป็นประเภท `std::string` ตัวอย่างที่สองล้มเหลวเนื่องจากประเภทของสตริงตามตัวอักษร `"apple"` ถือเป็น `const char*` โดยคอมไพลเลอร์ ซึ่งขัดแย้งกับประเภทของ `map2` (`std::string`) ข้อผิดพลาดสามารถแก้ไขได้ด้วยการระบุอาร์กิวเมนต์ของเทมเพลตอย่างชัดเจน: ``` int key2 = getkey<int, std::string>(map2, "apple"); ``` หรือโดยใช้ส่วนต่อท้ายตามตัวอักษร std::string: ``` โดยใช้เนมสเปซ std::string_literals; int key2 = getkey (map2, "apple" s); ```
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence