2016-10-02 9 views
0

私は問題がここにあるかを理解することはできませんよ、エラーなぜこの未解決のオーバーロードされた関数型エラーですか?コンパイル中

#include<iostream> 
#include<thread> 
#include<vector> 
using namespace std; 

int a=100; 

void div() 
{ 
     if(a!=0) int div1 = 100/a; 
} 

void assign() 
{ 
     a=0; 
} 

int main() 
{ 
     vector<thread> Threads; 

     for(int i=0;i<100;i++) 
     { 
       Threads.push_back(thread(div)); 
       Threads.push_back(thread(assign)); 
     } 
} 

グラム++ div.cpp -std = C++ 11 -pthread

div.cpp: In function ‘int main()’: 
div.cpp:24:31: error: no matching function for call to ‘std::thread::thread(<unresolved overloaded function type>)’ 
    Threads.push_back(thread(div)); 
          ^
In file included from div.cpp:2:0: 
/usr/include/c++/5/thread:133:7: note: candidate: template<class _Callable, class ... _Args> std::thread::thread(_Callable&&, _Args&& ...) 
     thread(_Callable&& __f, _Args&&... __args) 
    ^
/usr/include/c++/5/thread:133:7: note: template argument deduction/substitution failed: 
div.cpp:24:31: note: couldn't deduce template parameter ‘_Callable’ 
    Threads.push_back(thread(div)); 
          ^
In file included from div.cpp:2:0: 
/usr/include/c++/5/thread:128:5: note: candidate: std::thread::thread(std::thread&&) 
    thread(thread&& __t) noexcept 
    ^
/usr/include/c++/5/thread:128:5: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘std::thread&&’ 
/usr/include/c++/5/thread:122:5: note: candidate: std::thread::thread() 
    thread() noexcept = default; 
    ^
/usr/include/c++/5/thread:122:5: note: candidate expects 0 arguments, 1 provided 

を取得していますか?

答えて

2

という標準関数が<cstdlib>にあります。 divはC関数なので、グローバル名前空間に配置することができます。コンパイラは、どのdivを使用するかわかりません。

C++ヘッダーには他のC++ヘッダーが含まれている可能性があるため、プログラムで使用されているシステムヘッダーの1つを介して間接的に<cstdlib>が含まれています。

C標準ライブラリと競合する名前を定義しないでください。 div関数の名前を変更するか、独自の名前空間を使用します。また

、代わりにpush_backemplace_backを使用することをお勧めします。

Threads.emplace_back(div); 

これは直接スレッドを作成し、一時、そこから移動するの作成を避けることができます。

また、using namespace std;は、C++標準ライブラリ全体をスコープに持ち込むので、このようなプログラムの競合が発生する可能性があります。

+0

push_backがまったく機能しませんでした。遅くなってもまだ動作していないはずですか? – InQusitive

+0

@InQusitive正確に何がうまくいかなかったのですか? –

+0

divをdiv_testに置き換えたとき、push_backにはまだエラーが発生していました。私がemplace_backに置き換えると、それは正常にコンパイルされました。私の質問は、push_backはまだ正常にコンパイルされていないはずの一時的な作成ですか? – InQusitive

関連する問題