Pregunta

Estoy tratando de utilizar boost.thread con Metrowerks CodeWarrior 5.5.3; en el thread.hpp cabecera, me sale el error que está redefiniendo hilo :: 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();
    }
};

veo que, en efecto, hilo :: thread_data parece ser declarado dos veces. Lo que C ++ característica se utiliza allí? ¿Cómo puedo superar esa deficiencia compilador?

¿Fue útil?

Solución

El segundo ejemplo es una especialización parcial de la clase de plantilla, esto es válido C ++ y no debe resultar en un error de redefinición.

He tenido problemas con tales características en un compiladores MetroWerks en el pasado también, sin embargo, más específicamente, al utilizar los parámetros de plantilla plantilla con valores por defecto, el compilador nunca compilarlo. Mi solución fue bastante fácil, no proporcionan un valor por defecto ... (1)

Si yo fuera tú me gustaría probar la adición de una especialización completa para su tipo específico, y espero que el compilador utiliza algún camino de compilación diferente para aquellos y usted consigue más allá de esto .... (Esto es sólo una suposición, no tiene / usa un compilador Metrowerks estos días)

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

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

(1) Para ser honesto, esto fue hace muchos años, no creo que cualquier compilador compila plantillas totalmente en aquel entonces.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top