2012-01-06 12 views
10

Uso del codice per segnalare la durata di un'attività utilizzando std :: chrono :: high_resolution_clock ... parte di C++ 0x.C++ 0x compila ma errori di editor di eclissi anche con -gnu ++ 0x discovery

Posso compilare con successo le caratteristiche di C++ 0x in eclipse cdt utilizzando il flag -gnu ++ 0x. Nonostante la compilazione con successo, l'editor sembrava inconsapevole di C++ 0x e mostrava errori per qualsiasi caratteristica di C++ 0x nel mio codice. Ho risolto questo aggiungendo il flag -gnu ++ 0x alle opzioni di ricerca del mio progetto. Nota: Non mostra risolto fino a che fare un'altra compilazione e ricostruire l'indice ...

-E -P -v -dD "$ {} plugin_state_location /specs.cpp" -std = gnu ++ 0x

ho ancora un ultimo errore editore che non riesco liberarsi di "Symbol 'duration_cast' non poteva essere risolto" (ho avuto un pic ma i nuovi utenti non possono postare foto)

Chiunque hai qualche idea su come risolvere questo problema? Ecco il codice:

#ifndef _scoped_timer_h_ 
#define _scoped_timer_h_ 

#include <iostream> 
#include <chrono> 
#include "boost/noncopyable.hpp" 
#include "boost/format.hpp" 

using namespace std::chrono; 

    // Utility class for timing and logging rates 
// (ie "things-per-second"). 
// NB _any_ destructor invokation (including early return 
// from a function or exception throw) will trigger an 
// output which will assume that whatever is being measured 
// has completed successfully and fully. 
class scoped_timer : boost::noncopyable 
{ 
public: 


    scoped_timer(
    const std::string& what, 
    const std::string& units, 
    double n 
) 
    :_what(what) 
    ,_units(units) 
    ,_how_many(n) 
    ,_start(high_resolution_clock::now()) 
    {} 

    ~scoped_timer() { 
    high_resolution_clock::time_point stop = high_resolution_clock::now(); 
    const double t = 1e-9 * duration_cast<nanoseconds>(stop-_start).count(); 
    std::cout << (
     boost::format(
     "%1%: %|2$-5.3g| %|3$|/s (%|4$-5.3g|s)" 
    ) % _what % (_how_many/t) % _units % t 
    ) << std::endl; 
    } 

private: 

    const std::string _what; 
    const std::string _units; 
    const double _how_many; 
    const high_resolution_clock::time_point _start; 
}; 

#endif 
+0

possibile duplicato del [costruire C++ 0x presenta con Eclipse] (http://stackoverflow.com/q/8564544/636019) – ildjarn

+0

Nel mio caso, ho aggiunto "-std = C++ 0x" in Project -> Properties -> C++ - Build [Settings] -> G ++ Compiler [miscellanous] -> Altri flag. Ho controllato e c'è un solo file 'chrono' nei percorsi di inclusione. Quando apri la dichiarazione, ad es. premere F3 su , il file corretto viene aperto e ha una definizione per duration_cast. Ho anche notato che il completamento automatico non vede 'duration_cast' ma vede tutto il resto che mi serve dall'intestazione 'chrono'. – stratman

+0

Quale versione di Eclipse/CDT stai usando? – ildjarn

risposta

3

Eclipse ha il proprio parser. Questo parser non può gestire le caratteristiche di C++ 11 (C++ 0x). Quindi devi aspettare che il supporto per C++ 11 nel parser di eclissi sia pronto.

+0

Sai quando sarà pronto? – andrew

+0

Penso che non sarà mai pronto.Se fossi uno sviluppatore CDT, sceglierei di usare clang per questo. Ma questa è una libreria nativa non Java quindi questa non è davvero un'opzione. – Kocka

8

Per crono in Eclipse si dovrebbe aggiungere quei simboli

_GLIBCXX_USE_C99_STDINT_TR1 

e

__cplusplus = 201103L 

come aggiungerli:

proprietà prject -> C/C++ Generale -> Percorso e simboli -> Simboli (Tab) -> GNU C++ -> e lì fare clic su Aggiungi.

Ricordarsi di aggiungere __cplusplus con valore 201103L

+0

Ha funzionato. Grazie! – Florian

+1

funziona, grazie. forse puoi considerare di spiegare cosa sta facendo, per avere più senso? – MeM