2012-01-06 983 views
10

Uso un código para informar la duración de una tarea usando std :: chrono :: high_resolution_clock ... parte de C++ 0x.C++ 0x compila pero eclipse errores de editor incluso con -gnu ++ 0x descubrimiento

Puedo compilar con éxito las características de C++ 0x en eclipse cdt usando el indicador -gnu ++ 0x. Aunque compiló con éxito, el editor parecía no estar al tanto de C++ 0x, es decir, mostraba errores para cualquier característica de C++ 0x en mi código. Lo resolví agregando el indicador -gnu ++ 0x a mis opciones de descubrimiento de proyectos. Nota: No se muestra fijado hasta que lo haga otra compilación y reconstruir el índice ...

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

todavía tengo un error último editor que no puedo librarme de "símbolo 'duration_cast' no se pudo resolver" (que tenía una foto pero los nuevos usuarios no pueden publicar fotos)

Cualquiera ¿Tiene alguna idea sobre cómo solucionar esto? Aquí está el código:

#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

posible duplicado de [Preparar C++ 0x cuenta con Eclipse] (http://stackoverflow.com/q/8564544/636019) – ildjarn

+0

En mi caso, he añadido "-std = C++ 0x" al Proyecto -> Propiedades -> C++ - Construir [Configuraciones] -> Compilador G ++ [misceláneo] -> Otras banderas. Lo he verificado y solo hay un archivo 'crono' en las rutas de inclusión. Al abrir la declaración, p. presione F3 en , se abre el archivo correcto y tiene una definición para duration_cast. También observo que Autocomplete no ve 'duration_cast', pero ve todo lo demás que necesito del encabezado 'chrono'. – stratman

+0

¿Qué versión de Eclipse/CDT estás usando? – ildjarn

Respuesta

3

Eclipse tiene su propio analizador. Ese analizador no puede tratar las características C++ 11 (C++ 0x). Así que tienes que esperar hasta que el soporte de C++ 11 en el analizador de eclipse esté listo.

+0

¿Sabes cuándo estará listo? – andrew

+0

Creo que nunca estará listo.Si yo fuera un desarrollador de CDT, elegiría usar clang para esto. Pero esta es una biblioteca nativa, no Java, por lo que esta no es realmente una opción. – Kocka

8

Para crono en Eclipse se debe agregar esos símbolos

_GLIBCXX_USE_C99_STDINT_TR1 

y

__cplusplus = 201103L 

Cómo añadirlos:

propiedades prject -> C/C++ General -> Path y Símbolos -> Símbolos (Tab) -> GNU C++ -> y haga clic en Agregar.

Recuerde agregar __cplusplus con valor 201103L

+0

Eso funcionó. ¡Gracias! – Florian

+1

esto está funcionando, gracias. quizás puedas considerar explicar qué está haciendo, para que tengamos más sentido? – MeM