2011-12-20 14 views
7

no puedo por la vida de entender por qué esto no funciona:¿Por qué boost :: equals requiere que los rangos se puedan copiar?

#include <vector> 

#include "boost/algorithm/string/predicate.hpp" 

struct Test 
: 
    public std::vector<int> 
{ 
    Test() { } 
    Test(const Test&) { assert(false); } 
}; 

int main() 
{ 
    Test a; 
    Test b; 
    boost::algorithm::equals(a, b); 

    return 0; 
} 

Salida:

$ g++ boostEqualsCopyDemo.cpp -I /usr/include/boost-1_47 
$ a.out 
a.out: boostEqualsCopyDemo.cpp:10: Test::Test(const Test&): Assertion `false' failed. 
Aborted (core dumped) 

He intentado excavar a través del código de impulso pero se está haciendo girar mi cabeza. Parece absurdo; tan derrochador e innecesario. ¿Que esta pasando?

Respuesta

10

Boost está intentando fabricar un conjunto de rangos para los contenedores que pasa, y termina llamando al range_detail::is_char_ptr(), que es el nombre de un conjunto de plantillas de función que usa la deducción de parámetros de plantilla para determinar si el parámetro es char puntero de algún tipo o no (como se puede adivinar por el nombre).

Desafortunadamente, la plantilla de función 'catch-all' que devuelve 0 al hacer coincidir parámetros que no sean de char-puntero toma su parámetro por valor.

Creo que esto puede solucionarse cambiando el parámetro para tomar un const& en su lugar. Busque en el archivo boost/range/as_literal.hpp para:

template< class T > 
    inline long is_char_ptr(T /* r */) 
    { 
     return 0L; 
    } 

y cambiarlo a:

template< class T > 
    inline long is_char_ptr(T const& /* r */) // <-- add const& 
    { 
     return 0L; 
    } 

Estoy de ninguna manera un experto en la implementación de bibliotecas de plantillas complejas (utilizo 'em, I don' t write 'em), por lo que no pretendo que este cambio no cause otro desagradable efecto secundario.

+4

Consulte https://svn.boost.org/trac/boost/ticket/6149 para obtener un informe de error sobre este problema. –

+1

Esta reparación se encuentra ahora en el tronco de refuerzo, y debería ser parte de la versión 1.50: https://svn.boost.org/trac/boost/ticket/6149#comment:2 –

Cuestiones relacionadas