2016-11-07 10 views
0

すべてが働いたとcompletlyすべて壊しI #include <unistd.h>(これは私のCPPで単一の変更である)まで罰金コンパイル:#include <unistd.h>すべての作品やコンパイルなしでC++奇妙なコンパイルエラーが

test.cpp:173:33: error: no matching function for call to ‘std::thread::thread(, int, int, int)’ std::thread t1(read, 1, 0, 3), ^test.cpp:173:33: note: candidates are: In file included from test.cpp:6:0: /usr/include/c++/4.8/thread:133:7: note: template std::thread::thread(_Callable&&, _Args&& ...) thread(_Callable&& __f, _Args&&... __args)

[200 more similar lines]

を私は必要としますそれのためにhttps://stackoverflow.com/a/6856689/1879409

注:私はapt-get経由でncursesをインストールしましたが、おそらくこれが私のenvを破ったでしょうか?ここで

+0

あなたの 'read'がオーバーロードされたようです:http://pubs.opengroup.org/onlinepubs/7908799/xsh/read.html – krzaq

+3

のような音は' 'のように、グローバル名前空間に' read'関数を追加します。あなたは 'std :: thread t1(read、1、0、3)'で 'read'関数を使っていますか? – NathanOliver

+5

@OP do noteエラーメッセージをコードブロックにしないように編集すると、読みにくく、メッセージから情報が削除されます。たとえば、<未解決のオーバーロードされた関数型>は、HTMLタグとして扱われるため、削除されます。 – NathanOliver

答えて

1

std::thread t1(read, 1, 0, 3) 

あなたはstd::threadのコンストラクタに機能readへの関数ポインタを渡します。

unistd.hは、ssize_t read(int, void *, size_t)と宣言しています。

エラーメッセージからわかるように、read機能のオーバーロードがあります。 unistd.hをインクルードする前に使用したものは、unistd.hが宣言しているものと同じではありません。オーバーロードされた関数は暗黙的に関数ポインタに変換することはできません。なぜなら、コンパイラはあなたが使用しようとしている関数のどれかを知ることができないからです。

あいまいさを解決するために、識別子を正しい型の関数ポインタに明示的にキャストすることができます。