3

別のスレッドでテンプレート関数を実行しようとしていますが、IntelliSense (VC++ 2010 Express) でエラーが発生し続けます: 「エラー: コンストラクター "boost::thread::thread" のインスタンスが引数リストと一致しません」コンパイルするには、次のエラーが表示されます:「エラー C2661: 'boost::thread::thread': no overloaded function takes 5 arguments」

テンプレートを追加してからエラーが発生しただけなので、テンプレートと関係があると確信していますが、何が原因かわかりません。

boost::thread に渡す 2 つの引数は、次のように定義されたテンプレート関数です。

template<class F> 
void perform_test(int* current, int num_tests, F func, std::vector<std::pair<int, int>>* results);

と:

namespace Sort
{

template<class RandomAccessIterator>
void quick(RandomAccessIterator begin, RandomAccessIterator end);

} //namespace Sort

私はboost::threadを次のように呼び出そうとします:

std::vector<std::pair<int, int>> quick_results;
int current = 0, num_tests = 30;
boost::thread test_thread(perform_test, &current, num_tests, Sort::quick, &quick_results);
4

2 に答える 2

5

テンプレート関数は「実際の」関数ではありません。コンパイラは最初にそれをインスタンス化する必要があります。ただし、コンパイラがこれを行うには、関数をインスタンス化するテンプレート パラメーターの型を知る必要があります。コンパイラがコードからこれらのパラメーターを推測する方法はありません。

ただし、コードを次のように書き直すと:

typedef std::vector<std::pair<int, int>> container;
typedef container::iterator iterator;

boost::thread test_thread(
    &perform_test<Sort::quick<iterator>>, 
    &current, 
    num_tests, 
    &Sort::quick<iterator>, 
    &quick_results); 

それはうまくいくはずです。

于 2010-11-01T02:28:24.153 に答える
2

次のバージョンは、私にとっては問題なくコンパイルおよび実行されます。主な変更点は、perform_test意図したコンテキストでパラメーター 3 が正しくなるように宣言を変更することです。また、関数テンプレートの背後にコードがあることを確認します。

typedef std::vector<std::pair<int, int>> container;

template<class F> 
void perform_test(int* current, int num_tests, 
    void(* func)(typename F, typename F), container* results) 
{
    cout << "invoked thread function" << endl;
}

namespace Sort
{
    template<class RandomAccessIterator>
    void quick(RandomAccessIterator begin, RandomAccessIterator end)
    {
        cout << "invoked sort function" << endl;
    }

} //namespace Sort

int main()
{
    container quick_results;
    int current = 0, num_tests = 30;

    boost::thread test_thread(
        &perform_test<container::iterator>, 
        &current, 
        num_tests, 
        Sort::quick<container::iterator>, 
        &quick_results);    

    test_thread.join();
    return 0;
};
于 2010-11-01T14:53:59.967 に答える