2016-09-24 22 views
3

Ubuntu 14.04のQT作成者でC++ Boostライブラリを使用したいと思っています。UbuntuのQT作成者のBoostライブラリの使い方14.04

私が使ってBoostライブラリをインストール:

sudo apt-get install libboost-all-dev 

Boostライブラリがディレクトリにインストールされます。ここでは

/usr/include/boost 

は私のmain.cppにある

#include <QCoreApplication> 
#include<iostream> 
#include <boost/asio.hpp> 
#include <boost/asio/steady_timer.hpp> 

using namespace std; 


int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    boost::asio::steady_timer timer_; 
    timer_.expires_from_now(1000); 


    return a.exec(); 
} 

でも私。プロファイル:

QT += core 
QT -= gui 

CONFIG += c++11 

TARGET = test_boost_lib_in_QT 
CONFIG += console 
CONFIG -= app_bundle 

TEMPLATE = app 

SOURCES += main.cpp 

INCLUDEPATH += /usr/include/boost 

LIBS += -L/usr/include/boost -lboost_system 
LIBS += -L/usr/include/boost -lboost_chrono 
LIBS += -L/usr/include/boost -lboost_thread 
LIBS += -L/usr/include/boost -lboost_timer 

コンパイルエラーは以下のとおりです。(私は "CTRL + B" を使用してQTから直接コンパイル)

/home/ndn-experiment/Desktop/test_boost_lib_in_QT/main.cpp:13: error: no matching function for call to 'boost::asio::basic_waitable_timer<std::chrono::_V2::steady_clock>::basic_waitable_timer()' 
boost::asio::steady_timer timer_; 
         ^

/home/ndn-experiment/Desktop/test_boost_lib_in_QT/main.cpp:14: error: no matching function for call to 'boost::asio::basic_waitable_timer<std::chrono::_V2::steady_clock>::expires_from_now(int)' 
timer_.expires_from_now(1000); 
          ^

私は何をすべき?あなたはコンストラクタにio_serviceを渡す必要があるため

+0

first - asioにはio_serviceが必要です。 steady_timerのデフォルトコンストラクタはありません。 second - expires_from_nowは、パラメータとしてdurationを必要とします。 intパラメータのオーバーロードはありません。 – stefan

答えて

0

インターネットで非常に多くの記事を読んでいて、私が遭遇した多くのエラーが発生した後、私は最終的にプログラムを実行します。 はここに私は2つの点を強調し、自分の質問に答えたい:コンストラクタクラスのオブジェクトを作成する

  1. 別の方法は、以上の1つの引数

  2. boost::asio::steady_timer

  3. を使用するための正しい方法をとります

私のmain.cppに

#include <QCoreApplication> 
#include <iostream> 
#include <boost/asio.hpp> 
#include <boost/asio/steady_timer.hpp> 
#include <chrono> 
#include <boost/chrono.hpp> 

using namespace std; 

typedef boost::asio::steady_timer timer_type; 

class timer_expire{ 

public: 

    timer_expire(boost::asio::io_service& io):timer_(io){} 

    void timer_expires(int n_milliseconds) { 

     timer_.expires_from_now(boost::chrono::milliseconds(n_milliseconds)); 

     //need timer_.async_wait() here 

    } 

private: 
    timer_type timer_; 
}; 



int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    boost::asio::io_service io; 

    timer_expire timer_expire_(io); 
    timer_expire_.timer_expires(10000); 

    return a.exec(); 
} 

マイ.PROファイル(QMAKE_CXXFLAGSに注意してください)

QT += core 
QT -= gui 

CONFIG += c++11 

TARGET = test_boost_lib_in_QT 
CONFIG += console 
CONFIG -= app_bundle 

TEMPLATE = app 

SOURCES += main.cpp 

CONFIG += c++11 

QMAKE_CXXFLAGS += -std=c++11 

INCLUDEPATH += /usr/include/boost 

QMAKE_CXXFLAGS += -DBOOST_ASIO_DISABLE_STD_CHRONO 
LIBS += -L/usr/include/boost -lboost_system -lboost_chrono -lboost_thread -lboost_timer 

は私のg++バージョンが-DBOOST_ASIO_HAS_STD_CHRONOQMAKE_CXXFLAGSを設定することにより、boost::asio::steady_timerに別の方法があることを、このpostを参照してください4.8.4

注意です。

Chronoもご覧ください。

+0

あなたのラッパークラスは、期間のタイプを隠すので、悪いです。あなたが数時間、数秒などを渡すことができる元のインターフェイス。元のインターフェイスは型保護されていましたが、インターフェイスには何ミリ秒もかかるヒントはありません。 – stefan

+0

** boost :: asio :: steady_timer **をコンパイルする方法を示すためのおもちゃクラスです。 – Bloodmoon

2

最初のものは次のとおりです。

timer.expires_from_now(boost::posix_time::seconds(5)); 

boost::asio::io_service io; 
boost::asio::steady_timer timer(io); 

expires_from_nowintをとらないため、2番目の1があるが、それはduration引数が必要documentationを確認するのもよい一般的な考え方です。使用例があります。

+0

ありがとう、また私の答えを見てください。 – Bloodmoon