2016-12-31 18 views
1

の代入演算子を移動します。組み込みデバイス(C++ 11(C++ 0)を実験的にサポートしているTIのクロスコンパイラ)に対して次のコードをコンパイルしようとしています。ターゲット:コンストラクタを移動し、クラス

アームアラゴ-Linuxベースgnueabiスレッドモデル:4.5.3 20110311 (プレリリース)POSIXのGCCバージョン(GCC)


ムーブコンストラクタのデフォルト指定と移動assignement演算子はコンパイルできません(/home/user/test/main.cpp:40:26: error: 'th& th::operator=(th&&)' cannot be defaulted)。

std::make_unique & emplace_backは使用できません。

私はそれがこのプラットフォームで動作させるために、コードに変更するには何が必要ですか?

class th { 
    public: 
     void func() { 
      sleep(3); 
      *this->progress = 100; 
     } 

     th(int* prog) : 
      progress(prog), 
      m_thread(std::thread(&th::func, this)) {}; 

     th(th const& other) = delete; 
     th(th && other) = default; 
     th& operator=(th const& other) = delete; 
     th& operator=(th &&) = default; 

     void join() { m_thread.join(); } 
     int *progress; 

    private: 
     std::thread m_thread; 
}; 

int main(void) { 

     std::vector<int> progress; 
     progress.push_back(-1); 
     progress.push_back(-1); 

     std::deque<std::unique_ptr<th>> deq; 

     std::cout << "progress[0]:" << progress[0] << std::endl; 
     std::cout << "progress[1]:" << progress[1] << std::endl; 

     std::cout << "executing threads..." << std::endl; 

     for(size_t i = 0; i < 2; ++i) { 
      deq.push_back(std::unique_ptr<th>(new th(&progress[i]))); 
     } 

     while(true) { 
      std::cout << "SIZE:" << deq.size() << std::endl; 

      if(deq.size() == 0) 
       break; 

      for (std::deque<std::unique_ptr<th>>::iterator it = deq.begin(); it != deq.end(); it++) { 
       //std::cout << (*it)->progress << std::endl; 
       if(*((*it)->progress) == 100) { 
        std::cout << "JOIN & DELETE" << std::endl; 
        (*it)->join(); 
        deq.erase(it); 
       } 
       else { 
        std::cout << "STILL RUNNING" << std::endl; 
       } 
        //std::cout << *((*it)->progress) << std::endl; 
      } 
      sleep(1); 
     } 

    exit(EXIT_SUCCESS); 
} 

答えて

0

あなたはコンパイラと運の外出ように、gcc 4.5.xのは、gccのC++ 11のサポート機能のために、移動の特別なメンバ関数の生成をサポートsee N3053 for more details、ともhttps://gcc.gnu.org/gcc-4.5/cxx0x_status.htmlしません。あなたのコードはgcc5/6でうまくコンパイルされ、ライブでご覧になれます。here

一つのオプションを完全ライン

th(th const& other) = delete; 
th(th && other) = default; 
th& operator=(th const& other) = delete; 
th& operator=(th &&) = default; 

を削除し、コンパイラが作業を行うと、あなたのための特別なメンバ関数を発生させることです。ところで、std::threadはコピー不可能なので、コピーctorとコピー代入演算子はデフォルトで削除されます。

+0

ありがとう@vsoftco! gcc 4.5でスレッドを追加、削除する動的コンテナを作成する方法はありますか? – marc

+0

@mmmintカスタムのth(int *)以外のすべてのctorsをコンパイラに生成させる方法はありますか?つまり、特別なメンバー関数をデフォルト/削除する4行を取り除きます。 – vsoftco

関連する問題