2016-06-18 20 views
1

私は、何の問題、+が実行次のプログラムをコンパイルしていないテンプレートできませんでした<typename>ポインタタイプを推測しますか?

#include <thread> 
#include <future> 
#include <iostream> 
#include <algorithm> 
void f(int* first, 
     int* last, 
     std::promise<int> accumulate_promise) 
{ 
    int sum = std::accumulate(first, last, 0); 
    accumulate_promise.set_value(sum); // Notify future 
} 

int main() 
{ 
    int numbers[] = { 1, 2, 3, 4, 5, 6 }; 
    std::promise<int> accumulate_promise; 
    std::future<int> accumulate_future = accumulate_promise.get_future(); 
    std::thread work_thread(f, begin(numbers), end(numbers), 
          std::move(accumulate_promise)); 
    accumulate_future.wait(); // wait for result 
    std::cout << "result=" << accumulate_future.get() << '\n'; 
    work_thread.join(); // wait for thread completion 
} 

しかし、私はテンプレートに "F" を変更した場合:

template<typename Iterator> 
void f(Iterator first, 
     Iterator last, 
     std::promise<int> accumulate_promise) 
{ 
    int sum = std::accumulate(first, last, 0); 
    accumulate_promise.set_value(sum); // Notify future 
} 

そして、それは、コンパイル、gccのレポートを失敗し、そのスレッド::スレッド()ctorのは、適切な過負荷を見つけることができません: エラー:への呼び出しに該当する関数 'のstd ::スレッド::スレッド(、int型*、int型*、のstd :: remove_reference &> ::タイプ)'

何そのメッセージは、anytテンプレートにヒンジが間違っていますか? 修正方法?

ありがとうございました。

答えて

2

fがテンプレートです。緩い条件でそれを置くために

std::thread work_thread(f, begin(numbers), end(numbers), 
         std::move(accumulate_promise)); 

std::threadの最初のパラメータは関数ポインタまたは関数ポインタのように動作し、何かのいずれかです。最初のパラメータとしてテンプレートは使用されません。

テンプレートは、インスタンス化されるときにクラスまたは関数になります。テンプレートは使用時にインスタンス化されます。したがって、このテンプレート定義を与えて、次のような方法で使用します。

f(something.begin(), something.end(), some_kind_of_a_promise); 

テンプレートをインスタンス化して使用します。

f<int *> 

ここでインスタンス化されたテンプレートがあります。ここでは、次の作品:GCC 5.3.1

でテスト

std::thread work_thread(f<int *>, std::begin(numbers), 
         std::end(numbers), 
         std::move(accumulate_promise)); 

関連する問題