2015-07-14 15 views
6

Ho un programma di esempio contenente 6 punti utilizzando high_resolution_clock::now() dall'intestazione standard chrono. Prendo le differenze b/n ognuna di esse risultando in 3 differenze e le casta come auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count(); in microsecondi.nessuna funzione di corrispondenza per la chiamata a std :: vector <std::tuple> push_back

Ho un'altra variabile denominata durate che viene assegnata come segue: auto durations = std::make_tuple(duration1,duration2,duration3); contenente differenze di punto di tempo precedenti.

devo spingere questo tupla in un vettore, così ho introdotto std::vector<std::tuple<std::chrono::microseconds,std::chrono::microseconds,std::chrono::microseconds>> list; Tuttavia sull'utilizzo list.push_back(durations); ottengo un errore come:

prog.cpp: In function 'int main()': 
prog.cpp:36:29: error: no matching function for call to 'std::vector<std::tuple<std::chrono::duration<long long int, std::ratio<1ll, 1000000ll> >, std::chrono::duration<long long int, std::ratio<1ll, 1000000ll> >, std::chrono::duration<long long int, std::ratio<1ll, 1000000ll> > > >::push_back(std::tuple<long long int, long long int, long long int>&)' 
    list.push_back(durations); 

Ho provato a cercare su std::chrono::microseconds e altre std::chrono::duration roba here ma non ha avuto successo nel correggere il problema.

So che questo ha qualcosa a che fare con la mia negligenza del sistema di tipi, ma non riesco a individuare quell'errore. Qualsiasi aiuto sarebbe apprezzato, & qui è ideone link.

#include <iostream> 
#include <chrono> 
#include <vector> 
#include <tuple> 

using namespace std; 
using namespace std::chrono; 

void function() 
{ 
    long long number = 0; 

    for(long long i = 0; i != 2000000; ++i) 
    { 
     number += 5; 
    } 
} 

int main() 
{ 
    high_resolution_clock::time_point t1 = high_resolution_clock::now(); 
    high_resolution_clock::time_point t3 = high_resolution_clock::now(); 
    high_resolution_clock::time_point t5 = high_resolution_clock::now(); 
    function(); 
    high_resolution_clock::time_point t2 = high_resolution_clock::now(); 
    high_resolution_clock::time_point t4 = high_resolution_clock::now(); 
    high_resolution_clock::time_point t6 = high_resolution_clock::now(); 

    auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count(); 
    auto duration2 = std::chrono::duration_cast<std::chrono::microseconds>(t4 - t3).count(); 
    auto duration3 = std::chrono::duration_cast<std::chrono::microseconds>(t6 - t5).count(); 

    auto durations = std::make_tuple(duration1,duration2,duration3); 

    std::vector<std::tuple<std::chrono::microseconds,std::chrono::microseconds,std::chrono::microseconds>> list; 
    list.push_back(durations); 

    cout << duration1 << " -- "<< duration2 << " -- "<< duration3 << " -- "; 
    return 0; 
} 

risposta

5

È stata creata una tupla di 3 interi e si sta cercando di aggiungerlo a un vettore di 3 durate.

Prendo le differenze b/n ognuna di esse risultando in 3 differenze e le casta come auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count(); in microsecondi.

Perché si sta chiamando count() sulle durate dopo aver fatto il duration_cast da convertire in microsecondi?

Basta tenere i valori come microseconds oggetti e li si può aggiungere al vettore:

auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1); 
auto duration2 = std::chrono::duration_cast<std::chrono::microseconds>(t4 - t3); 
auto duration3 = std::chrono::duration_cast<std::chrono::microseconds>(t6 - t5); 
+1

anche io vorrei ringraziarvi per il vostro lavoro su cpp :) –

4

Il tipo di std::chrono::microseconds::count() non è std::chrono::microseconds, è un po 'firmato tipo integrale.

auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count(); 
//decltype(duration1) is not std::chrono::microseconds 

Come tale, non è possibile utilizzare il duration*n* variabili per un vettore in attesa microsecond valori.

La correzione è semplice, basta rinviare la chiamata di count finché non si tenta di stampare il contenuto.

2

Si sta verificando una mancata corrispondenza del tipo.

auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count() 

In realtà ti dà un long long nel tuo caso e non un std::chrono::microseconds.È possibile risolvere questo problema utilizzando decltype() e cambiando

std::vector<std::tuple<std::chrono::microseconds,std::chrono::microseconds,std::chrono::microseconds>> list; 

Per

std::vector<decltype(durations)> list; 

Live Example

4

E 'semplice: non chiamare count.

std::chrono::microseconds è (nel tuo caso) un typedef per il tipo std::chrono::duration<long long int, std::ratio<1ll, 1000000ll> >. Questo è anche il tipo che ottieni dal fare std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).

Tuttavia, questo non è quello che stai assegnando a duration1. Stai assegnando il risultato della chiamata alla funzione count su quel tipo. E che restituisce il numero di tick come numero (long long int nel caso della tua libreria standard), e non come duration.

Problemi correlati