2017-10-23 9 views
0

私は-std=c++11のCMakeメイクファイルでC++を使用しています。C++ 11 cmake O3オプション<std :: thread>の初期化用にコンストラクタが一致しません。

私のプログラムはいくつかのスレッドメソッドを使用しています。私は問題なくプログラムをビルドして実行できます。

しかし、私はcmakeのオプションに-03最適化フラグを追加するとき、私は、このエラーメッセージがあります。

"の初期設定に該当するコンストラクタ 'のstd ::スレッド'"

まずI Dを「なぜ-O3オプションにしか表示されないのかわかりません。

-O3でコンパイルしたいと思っていますが、私はmythread = std::thread(&X::run<A, B>, this, a, b);について話していますが、私のプログラムではうまくいかず、使い方が分かりません。の場合には、私は正確に&X::run<A, B>が何であるかを理解していないstd::thread(&X::run<A, B>, this, a, b);の場合std::thread t1(get4points,&myImage, ...

:私は非常に簡単に呼び出す

static void getPoints(Mat *in, vector<Point> *posPoint, float *h,int rad, int dex,int decy, Mat *debug = NULL); 

今日:ここ

私の機能を私はスレッドに撮りたいです私は同じクラスの関数で1つのクラスの関数を呼び出します。

例の擬似コード:

class myclass 
{ 
    template<int A, int B> void run(int a, int b) 
    { 
     // ... 
    } 

    void myMainfunction(int a, int b) 
    { 
     ?????? -> std::thread(&this::run<int, int>, this, 1, 1); 
    } 
}; 

答えて

2

あなたのコードの例から、あなたがスレッドのコンストラクタに渡すために、具体的な機能を指定するために、すべてのテンプレートパラメータを定義する必要があります。

あなたは持っているので、場合:

class myclass 
{ 
    template<int A, int B> void run(int a, int b) 
    { 
    } 
}; 

あなたがのためのパラメータを指定する必要が& Bのように:あなたの方法はstaticある

auto x = std::thread(&myclass::run<55, 66>, this, 1, 1); 

場合は、そのようまったく関連オブジェクトが存在しませんオブジェクトコンストラクタにオブジェクトポインタを渡すのは意味がありません。

class myclass 
{ 
    template<int A, int B> static void run(int a, int b) 
    { 
    } 
}; 


auto x = std::thread(&myclass::run<77, 88>, 1, 1); 

をあなたが尋ねる:シンプルあなたは書く必要はあり

のstd ::スレッドの場合

(& X ::実行、このA、B)。私は正確に何かを理解していない& X :: run、私は同じクラスの関数で1つのクラスの関数を呼び出す場合。

クラスとオブジェクトの違いを理解できません。 thisは、クラス自体のオブジェクトではなく、クラスのオブジェクトを指します。テンプレートを使って遊ぶ前に、C++の基本について読んでみましょう。 static関数の場合、すでに述べたようなオブジェクトはありません。

class myclass 
{ 
    private: 
     int ia; 

    public: 
     myclass(int _ia): ia{_ia}{} 

     template<int A, int B> static void staticFun(int a, int b) 
     { 
      std::cout << "Val of A: " << A << " Val of B: " << B << " a: " << a << " b: " << b << std::endl; 
     } 

     template<int A, int B> void Fun(int a, int b) 
     { 
      std::cout << "Val of A: " << A << " Val of B: " << B << " a: " << a << " b: " << b << " ia of instance: " << ia << std::endl; 
     } 
}; 

int main() 
{ 
    myclass mc1(1); 
    myclass mc2(2); 

    auto x = std::thread(&myclass::staticFun<55, 66>, 1, 2); 
    auto y = std::thread(&myclass::Fun<77,88>, &mc1, 3, 4); 
    auto z = std::thread(&myclass::Fun<78,89>, &mc2, 5, 6); 


    x.join(); 
    y.join(); 
    z.join(); 
} 

出力はそのような何かになります:thisポインタ、オブジェクトや非静的関数への呼び出しを使用している場合

は、この例で見てみましょうアイデアを取得するにはBの55のVal:66:1 B:2

ヴァル:Bの77のVal:88:3 B:インスタンスの4 IA:1

のヴァル

のヴァル:Bの78ヴァル:89:5 B:インスタンスの6 IA:2

をしかし、STDのオペレータ<<を呼び出すこと:: coutのは何のすべてで同期されることを覚えていません。したがって、各スレッドはいつでもストリームに書き込むことができ、結果は破損するか、または任意の順序で破棄されます。

関連する問題