2009-07-10 15 views
3

Ich versuche boost.thread mit metrowerks codewarrior 5.5.3 zu verwenden; im Header thread.hpp, erhalte ich die Fehlermeldung, dass er Thread :: thread_data ist neu zu definieren:Compilerfehler boost.thread mit Metrowerks-Compiler lösen

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

Ich sehe, dass in der Tat Faden :: thread_data scheint zweimal deklariert zu werden. Welche C++ - Funktion wird dort verwendet? Wie kann ich diesen Compiler-Mangel überwinden?

Antwort

1

Die zweite Instanz ist eine partielle Spezialisierung der Vorlagenklasse, dies ist C++ und sollte nicht zu einem Neudefinitionsfehler führen.

Ich hatte Probleme mit solchen Features in einem metrowerks Compiler in der Vergangenheit, obwohl, genauer gesagt, wenn Vorlagen Template-Parameter mit Standardwerten verwenden, würde der Compiler es nie kompilieren. Meine Problemumgehung war ziemlich einfach, stellen Sie keinen Standardwert zur Verfügung ... (1)

Wenn ich Sie wäre, würde ich versuchen, eine vollständige Spezialisierung für Ihren spezifischen Typ hinzuzufügen, und hoffe, der Compiler verwendet einen anderen Kompilierpfad für diejenigen, und bekommt man diese Vergangenheit .... (dies ist nur eine wilde Vermutung, ich habe kein Compiler Metrowerks haben in diesen Tagen/verwenden)

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

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

(1) Um ehrlich zu sein, das war viele Jahre Ich glaube nicht, dass irgendein Compiler damals Vorlagen komplett kompiliert hat.

+0

Vielen Dank für die klare und präzise Antwort :) – akappa

Verwandte Themen