2009-07-10 7 views
3

J'essaie d'utiliser boost.thread avec metrowerks codewarrior 5.5.3; dans le thread.hpp d'en-tête, je reçois l'erreur qu'il redéfinit fil :: thread_data:Résoudre l'erreur de compilation boost.thread avec le compilateur Metrowerks

class BOOST_THREAD_DECL thread 
{ 
private: 
    ...   
    template<typename F> 
    struct thread_data: 
     detail::thread_data_base 
    { 
     F f; 

     thread_data(F f_): 
      f(f_) 
     {} 
     thread_data(detail::thread_move_t<F> f_): 
      f(f_) 
     {} 

     void run() 
     { 
      f(); 
     } 
    }; 
    ... 
}; 

template<typename F> 
struct thread::thread_data<boost::reference_wrapper<F> >: 
    detail::thread_data_base 
{ 
    F& f; 

    thread_data(boost::reference_wrapper<F> f_): 
     f(f_) 
    {} 

    void run() 
    { 
     f(); 
    } 
}; 

Je vois que, en effet, le fil :: thread_data semble être déclarée deux fois. Quelle fonction C++ est utilisée? Comment puis-je surmonter cette lacune du compilateur?

Répondre

1

La deuxième instance est une spécialisation partielle de la classe template, c'est un C++ valide et ne devrait pas entraîner une erreur de redéfinition. J'ai déjà eu des problèmes avec de telles fonctionnalités dans un compilateur Metrowerks dans le passé, mais plus particulièrement lorsque j'utilise des paramètres de modèle de template avec des valeurs par défaut, le compilateur ne le compile jamais. Ma solution de contournement était plutôt facile, ne pas fournir une valeur par défaut ... (1)

Si j'étais vous j'essaierait d'ajouter une spécialisation complète pour votre type spécifique, et espère que le compilateur utilise un chemin de compilation différent pour ceux-ci et vous obtient passé ce .... (ce qui est juste une supposition sauvage, je n'ai pas/utiliser un compilateur Metrowerks ces jours-ci)

typedef boost::function< void() > MyThreadFunction; // or whatever you need 

template <> 
struct thread::thread_data<boost::reference_wrapper<MyThreadFunction> >: 
    detail::thread_data_base 
{ 
    .... 
}; 

(1) Pour être honnête, cela a été de nombreuses années il y a quelque temps, je ne pense pas qu'aucun compilateur ait compilé des modèles à l'époque.

+0

Merci beaucoup pour la réponse claire et précise :) – akappa

Questions connexes