2012-01-06 30 views
10

Tôi sử dụng một số mã để báo cáo thời lượng của tác vụ bằng cách sử dụng std :: chrono :: high_resolution_clock ... một phần của C++ 0x.C++ 0x biên dịch nhưng lỗi biên tập nhật thực ngay cả với -gnu ++ 0x discovery

Tôi có thể biên dịch thành công các tính năng C++ 0x trong đĩa CD eclipse bằng cờ -gnu ++ 0x. Mặc dù biên dịch thành công, trình chỉnh sửa dường như không biết C++ 0x tức là nó hiển thị lỗi cho bất kỳ tính năng C++ 0x nào trong mã của tôi. Tôi đã giải quyết điều đó bằng cách thêm cờ -gnu ++ 0x vào các tùy chọn khám phá dự án của tôi. Lưu ý: không hiển thị cố định cho đến khi bạn thực hiện một biên dịch khác và xây dựng lại chỉ mục ...

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

tôi vẫn có một lỗi biên tập cuối cùng mà tôi không thể thoát khỏi bản thân mình của "Symbol 'duration_cast' không thể được giải quyết" (tôi đã có một pic nhưng người dùng mới không thể gửi bức ảnh)

Bất cứ ai có ý tưởng nào về cách sửa lỗi này không? Đây là mã:

#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

thể trùng lặp của [Build C++ 0x tính năng với Eclipse] (http://stackoverflow.com/q/8564544/636019) – ildjarn

+0

Trong trường hợp của tôi, tôi đã thêm "-std = C++ 0x" vào Project -> Properties -> C++ - Xây dựng [Settings] -> G ++ Compiler [miscellanous] -> Cờ khác. Tôi đã kiểm tra và chỉ có một tệp 'chrono' trong các đường dẫn bao gồm. Khi mở tờ khai, ví dụ: nhấn F3 trên , tệp chính xác được mở và có định nghĩa cho duration_cast. Tôi cũng lưu ý rằng tự động hoàn thành không thấy 'duration_cast' nhưng thấy mọi thứ khác tôi cần từ tiêu đề 'chrono'. – stratman

+0

Bạn đang sử dụng phiên bản Eclipse/CDT nào? – ildjarn

Trả lời

3

Eclipse có trình phân tích cú pháp riêng. Trình phân tích cú pháp đó không thể xử lý các tính năng C++ 11 (C++ 0x). Vì vậy, bạn phải đợi cho đến khi hỗ trợ C++ 11 trong trình phân tích cú pháp eclipse sẽ sẵn sàng.

+0

Bạn có biết khi nào nó sẵn sàng không? – andrew

+0

Tôi nghĩ rằng nó sẽ không bao giờ sẵn sàng.Nếu tôi là một nhà phát triển CDT, tôi sẽ chọn sử dụng clang cho việc này. Nhưng đây là một thư viện bản địa không phải Java nên đây thực sự không phải là một lựa chọn. – Kocka

8

Đối với chrono trong eclipse bạn nên thêm những biểu tượng

_GLIBCXX_USE_C99_STDINT_TR1 

__cplusplus = 201103L 

Làm thế nào để thêm chúng:

tính Prject -> C/C++ General -> Path và Biểu tượng -> Ký hiệu (Tab) -> GNU C++ -> và nhấp vào thêm.

Hãy nhớ thêm __cplusplus với giá trị 201103L

+0

Điều đó có hiệu quả. Cảm ơn! – Florian

+1

điều này đang hoạt động, cảm ơn. có lẽ bạn có thể xem xét để giải thích nó đang làm gì, để chúng ta có ý nghĩa hơn? – MeM

Các vấn đề liên quan