2010-10-31 9 views
3

J'essaye d'exécuter une fonction template sur un thread séparé mais IntelliSense (VC++ 2010 Express) continue à me donner l'erreur: "Erreur: aucune instance de constructeur" boost :: thread :: fil « correspond à la liste des arguments » et si je tente de compiler je reçois cette erreur: « erreur C2661: « boost :: :: fil fil »: fonction ne prend en surcharge 5 arguments »boost :: fonctions thread et template

l'erreur n'a eu lieu Depuis que j'ai ajouté les modèles, je suis certain que cela a quelque chose à voir avec eux, mais je ne sais pas quoi.

Deux des arguments je passe à boost :: thread ne sont définis comme modèle:

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

et:

namespace Sort 
{ 

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

} //namespace Sort 

Je tente d'appeler boost :: fil comme ceci:

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); 

Répondre

2

La version suivante se compile et s'exécute OK pour moi - le changement principal est de modifier la déclaration perform_test afin que le paramètre 3 soit correct dans le contexte que vous avez l'intention. Aussi pour s'assurer qu'il y a du code derrière les modèles de fonction.

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; 
}; 
+0

Parfait, merci. – Rarge

5

Une fonction de modèle n'est pas une fonction 'réelle'. Le compilateur doit d'abord l'instancier. Mais pour que le compilateur fasse cela, il doit connaître les types de paramètres de template pour lesquels vous souhaitez instancier la fonction. Le compilateur n'a aucun moyen de déduire ces paramètres de votre code.

Cependant, si vous repassez le code comme:

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); 

il devrait fonctionner.

+0

Nous vous remercions de votre aide. – Rarge

Questions connexes