2017-06-22 1 views
1
chrono

quand je compilé ce timer.hpp fichier d'en-tête ci-dessous, Le compilateur dit erreur: aucune correspondance pour « opérateur = » (types d'opérandes sont 'std :: chrono :: _ V2 :: system_clock :: time_point {alias std :: chrono :: time_point>>}' et 'std :: __ success_type>> :: type {alias std :: chrono :: duration>} ') end = std :: chrono :: high_resolution_clock :: maintenant() - start;Aucune correspondance pour « opérateur = » lors de l'utilisation std :: :: high_resolution_clock

Je suppose que le type de variable pour le début et la fin est faux. Quel est le bon type? Je veux utiliser std :: chrono :: high_resolution_clock.

#include <chrono> 

namespace timer{ 
static std::chrono::system_clock::time_point start, end; 

void initTime(){ 
    start = std::chrono::high_resolution_clock::now(); 
} 


void endTime(){ 
    end = std::chrono::high_resolution_clock::now() - start; 
} 

} 

timer.hpp est censé être utilisé avec un certain fichier principal. En appelant timer :: initTime() avant une fonction que je veux mesurer et en appelant timer :: endTime() après la fonction, j'obtiendrais le résultat du timing (le getter pour la durée time est omis ici).

+0

Voici un didacticiel vidéo pour 'chrono': https://www.youtube.com/watch?v=P32hvk8b13M Il permet de résoudre les problèmes de ce type. –

Répondre

2

Il y a deux problèmes avec ce code:

static std::chrono::system_clock::time_point start, end; 
/* ... */ 

void endTime(){ 
    end = std::chrono::high_resolution_clock::now() - start; 
} 

Vous déclarez end comme point de temps, mais sur le côté droit de l'opérateur d'affectation, vous soustrayez deux points de temps (now() et start), et en attribuant à end.

Logiquement, si vous soustrayez deux time points, vous n'obtenez pas un nouveau point de temps. Par exemple, si je voulais soustraire "08:15:00 aujourd'hui" - "08:05:00 aujourd'hui", il ne serait pas logique de décrire le résultat comme "00:10:00 aujourd'hui". Au lieu de cela, la bibliothèque chrono C++ a un duration class template; il est destiné à représenter les durées (par exemple la différence entre deux points temporels).

Voir le numéro de surcharge operator - 4 ici: http://en.cppreference.com/w/cpp/chrono/time_point/operator_arith2

Je suggère de regarder la vidéo tutoriel qui @Howard Hinnant lien ci-dessus ... M. Hinnant est l'auteur principal de la bibliothèque boost::chrono, qui a servi de base pour les composants chrono dans la bibliothèque standard C++.

A potentiel seconde question est questart est de type std::chrono::system_clock::time_point, qui peut être un autre type (différent de l'horloge) que le type renvoyé par std::chrono::high_resolution_clock::now() (qui est de type std::chrono::high_resolution_clock::time_point).

+0

Nitpick: Je suis l'auteur principal (il y avait d'autres contributeurs) sur la bibliothèque 'std :: chrono' qui a servi de base à la bibliothèque' boost :: chrono'. :-) –

+0

J'ai changé la caractérisation en conséquence. – NicholasM

+0

Merci. Un de mes points est que dans ce cas, 'std' est venu en premier et' boost 'a suivi. Eh bien, au moins le projet de «std» est venu en premier. Le boost lib est probablement arrivé avant que le std ne soit définitif en 2011. Ce n'est pas vraiment important pour votre bonne réponse (que j'ai upvoted). Ce ne sont que des fioritures historiques. –