Perché non posso usare la libreria chrono?

Aug 18 2020

Ciao, sto facendo un semplice esercizio con il thread, voglio che il mio t1 dorma per 2 secondi ma ricevo questo errore: impossibile trovare l'operatore letterale numerico 'operator "" s'

Come è possibile?

#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;
}

Risposte

8 chakaz Aug 18 2020 at 14:37

A partire dal https://en.cppreference.com/w/cpp/symbol_index/chrono_literals:

Questi operatori sono dichiarati nello spazio dei nomi std::literals::chrono_literals, dove entrambi literalse chrono_literalssono spazi dei nomi inline. L'accesso a questi operatori può essere acquisita con using namespace std::literals, using namespace std::chrono_literalse using namespace std::literals::chrono_literals.

Quindi aggiungi semplicemente using namespace std::literals::chrono_literals;al tuo file e dovresti essere a posto.


Modificare:

Indipendentemente dal problema sopra, stai costruendo i thread t2e in t3modo errato. Invece di un lambda che accetta un std::thread&come argomento, probabilmente intendevi catturarlo nel lambda per riferimento in quanto tale:

    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();