Question

Je suis en train d'utiliser boost.thread avec Metrowerks CodeWarrior 5.5.3; dans l'en-tête thread.hpp, je reçois l'erreur qu'il redéfinit fil :: thread_data:

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 est la caractéristique C ++ est utilisé là-bas? Comment puis-je surmonter cette carence du compilateur?

Était-ce utile?

La solution

La deuxième instance est une spécialisation partielle de la classe de modèle, ceci est valable C ++ et ne doit pas donner lieu à une erreur de redéfinition.

J'ai eu des problèmes avec ces caractéristiques dans un compilateurs Metrowerks dans le passé aussi bien que, plus particulièrement, lors de l'utilisation des paramètres du modèle de modèle avec des valeurs par défaut, le compilateur ne le compiler. Ma solution a été assez facile, ne fournit pas une valeur par défaut ... (1)

Si je vous, je vais essayer d'ajouter une spécialisation complète pour votre type spécifique, et espère que le compilateur utilise un certain 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, ce fut il y a, je ne pense pas que de nombreuses années tout compilateur compilé entièrement à l'époque des modèles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top