3 votes

C++ sur MacOS : problème d'affichage de la date et de l'heure

J'ai acheté un MacBook Pro et j'utilise MacOS depuis deux jours. J'ai essayé d'écrire ce code C++ qui affiche la date et l'heure à l'aide de la fonction chrono y ctime bibliothèques. Ce code fonctionnait très bien sur ma machine Windows et mon serveur CentOS7. Cependant, sur mon MacBook Pro, il ne compile pas. Voici le message d'erreur que j'obtiens lorsque j'essaie de compiler avec G++ :

main.cpp:19:61: error: no viable conversion from 'time_point<std::__1::chrono::steady_clock,
      duration<[...], ratio<[...], 1000000000>>>' to 'const
      time_point<std::__1::chrono::system_clock, duration<[...], ratio<[...], 1000000>>>'
    std::time_t date = std::chrono::system_clock::to_time_t(now);
                                                            ^~~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/chrono:1340:28: note: candidate constructor
      (the implicit copy constructor) not viable: no known conversion from
      'std::__1::chrono::time_point<std::__1::chrono::steady_clock, std::__1::chrono::duration<long long,
      std::__1::ratio<1, 1000000000> > >' to 'const
      std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long,
      std::__1::ratio<1, 1000000> > > &' for 1st argument
class _LIBCPP_TEMPLATE_VIS time_point
                           ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/chrono:1340:28: note: candidate constructor
      (the implicit move constructor) not viable: no known conversion from
      'std::__1::chrono::time_point<std::__1::chrono::steady_clock, std::__1::chrono::duration<long long,
      std::__1::ratio<1, 1000000000> > >' to 'std::__1::chrono::time_point<std::__1::chrono::system_clock,
      std::__1::chrono::duration<long long, std::__1::ratio<1, 1000000> > > &&' for 1st argument
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/chrono:1359:5: note: candidate template
      ignored: could not match 'std::__1::chrono::system_clock' against 'std::__1::chrono::steady_clock'
    time_point(const time_point<clock, _Duration2>& t,
    ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/chrono:1566:53: note: passing argument to
      parameter '__t' here
    static time_t     to_time_t  (const time_point& __t) _NOEXCEPT;
                                                    ^
1 error generated.
basavyr@Roberts-MacBook-Pro simpleTest %

Voici le code :

void getTime()
{
    auto now = std::chrono::high_resolution_clock::now();
    std::time_t date = std::chrono::system_clock::to_time_t(now);
    std::cout << std::ctime(&date);
}
int main()
{
getTime();
}

Je suppose que le problème est lié au fait que MacOS utilise le compilateur CLANG ? Avez-vous une idée de la façon dont je peux résoudre ce problème ?

Merci !

6voto

Alan Birtles Points 12524

Votre code n'est susceptible de fonctionner que si std::high_resolution_clock est le même type que std::system_clock . Il n'y a aucune garantie que les points de temps de différentes horloges soient identiques ou convertibles.

Pour la conversion en time_t qui n'a qu'une résolution de quelques secondes system_clock sera parfaitement adéquate :

void getTime()
{
    auto now = std::chrono::system_clock::now();
    std::time_t date = std::chrono::system_clock::to_time_t(now);
    std::cout << std::ctime(&date);
}
int main()
{
    getTime();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X