Por que não consigo usar a biblioteca chrono?

Aug 18 2020

Olá, estou fazendo um exercício fácil com thread, quero que meu t1 durma por 2 segundos, mas estou recebendo este erro: não foi possível encontrar o operador literal numérico 'operador "" s'

Como isso é possível?

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

Respostas

8 chakaz Aug 18 2020 at 14:37

De https://en.cppreference.com/w/cpp/symbol_index/chrono_literals:

Esses operadores são declarados no namespace std::literals::chrono_literals, onde literalse chrono_literalssão namespaces embutidos. O acesso a estes operadores podem ser adquiridas com using namespace std::literals, using namespace std::chrono_literalse using namespace std::literals::chrono_literals.

Portanto, basta adicionar using namespace std::literals::chrono_literals;ao seu arquivo e pronto.


Editar:

Independentemente da questão acima, você está construindo os fios t2e t3incorretamente. Em vez de um lambda que aceita um std::thread&como argumento, provavelmente você pretendia capturá-lo no lambda por referência como tal:

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