ฉันมีคลาสส่วนหัวเท่านั้นที่มีสองฟังก์ชัน
//F1
void add_argument(const std::string &name, const std::string &desc,
const bool required = false) {
//...
}
และ
//F2
void add_argument(const std::string &name, const std::string &long_name,
const std::string &desc, const bool required = false) {
//...
}
และในรหัสของฉันฉันโทร
//L1: should call F2
add_argument("-w", "--write",
"Writes the calibrated values to the config.",
false);
//L2: should also call F2
add_argument(
"-i", "--interval",
"The time interval in milliseconds that it should check in.");
พฤติกรรมที่ตั้งใจไว้คือทั้ง L1 และ L2 เรียกเมธอดเดียวกัน F2 อย่างไรก็ตาม เมื่อฉันคอมไพล์และรัน L1 จะเรียก F2 อย่างถูกต้อง แต่ L2 จะเรียก F1
สิ่งที่ฉันสงสัยคือเหตุใดจึงปรากฏว่าใน L2 กำลังแปลงสตริงสุดท้ายเป็นบูลีนและไม่ได้ใช้อาร์กิวเมนต์เริ่มต้น นี่เป็นส่วนหนึ่งของมาตรฐาน C++11 หรือไม่ มันเป็นข้อผิดพลาดของคอมไพเลอร์/ลิงก์เกอร์ หรือฉันทำผิดพลาดไปหรือเปล่า
สิ่งนี้กำลังถูกคอมไพล์และรันบน RaspberryPi
Linux raspberrypi 4.14.71-v7+ Raspbian GNU/Linux 9 (stretch)
g++ (Raspbian 6.3.0-18+rpi1+deb9u1) 6.3.0 20170516
GNU ld (GNU Binutils for Raspbian) 2.28
การใช้คำสั่งที่คล้ายกันนี้ (จริงๆ แล้วฉันใช้ cmake กับคำสั่ง make นั้นยากที่จะคัดลอกอย่างแน่นอน)
g++ -std=c++11 -Wall -I. main.cpp -o test
(ฉันไม่ได้รับคำเตือนจากคอมไพเลอร์)
const char[]
ถึงstd::string
) ดูที่นี่ สำหรับคำอธิบายโดยละเอียด - person alter igel   schedule 10.12.2018std::string
อย่างชัดเจนได้ เช่น โดยการส่งstd::string("The time interval in milliseconds that it should check in.")
แต่ฉันไม่แน่ใจว่ามีวิธีแก้ไขปัญหาที่ง่ายกว่านี้หรือไม่ที่จะป้องกันไม่ให้หลุมพรางนี้เกิดขึ้นอย่างเงียบ ๆ ตั้งแต่แรก - person alter igel   schedule 10.12.2018"string"s
ดู: en.cppreference.com/w/cpp/string/ basic_string/ตัวดำเนินการ%22%22s - person Evg   schedule 10.12.2018