เหตุใดฉันจึงใช้ไลบรารีโครโนไม่ได้

Aug 18 2020

สวัสดีฉันกำลังทำแบบฝึกหัดง่ายๆกับเธรดฉันต้องการให้ t1 นอน 2 วินาที แต่ฉันได้รับข้อผิดพลาดนี้: ไม่พบตัวดำเนินการ 'ตัวดำเนินการตามตัวอักษร' ที่เป็นตัวเลข

เป็นไปได้อย่างไร?

#include <iostream>
#include <chrono>
#include <thread>

void printt1(int i)
{   std::this_thread::sleep_for(2s);
    std::cout << i<<std::endl;
}
int main()
{
    std::thread t1(printt1,1);
    std::thread t2([](std::thread& t1) { t1.join();std::cout << 2<<std::endl; });
    std::thread t3([](std::thread& t2) { t2.join();std::cout << 3<<std::endl; });
    t3.join();
    return 0;
}

คำตอบ

8 chakaz Aug 18 2020 at 14:37

จาก https://en.cppreference.com/w/cpp/symbol_index/chrono_literals:

ตัวดำเนินการเหล่านี้ถูกประกาศในเนมสเปซstd::literals::chrono_literalsโดยที่ทั้งสองliteralsและchrono_literalsเป็นเนมสเปซแบบอินไลน์ การเข้าถึงผู้ประกอบการเหล่านี้จะได้รับด้วยusing namespace std::literals, และusing namespace std::chrono_literalsusing namespace std::literals::chrono_literals

ดังนั้นเพียงเพิ่มusing namespace std::literals::chrono_literals;ไฟล์ของคุณและคุณควรจะไป


แก้ไข:

โดยไม่คำนึงถึงปัญหาข้างต้นคุณกำลังสร้างเธรดt2และt3ไม่ถูกต้อง แทนที่จะเป็นแลมบ์ดาที่ยอมรับ a std::thread&เป็นอาร์กิวเมนต์คุณอาจต้องการจับมันในแลมด้าโดยการอ้างอิงดังนี้:

    std::thread t1(printt1,1);
    std::thread t2([&t1]() { t1.join();std::cout << 2<<std::endl; });
    std::thread t3([&t2]() { t2.join();std::cout << 3<<std::endl; });
    t3.join();