2011-12-20 14 views
7

nie może dla życia mnie zrozumieć, dlaczego to się nie powiedzie:Dlaczego funkcja boost :: equals wymaga zakresu do kopiowania?

#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; 
} 

wyjściowa:

$ 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) 

Próbowałem kopanie poprzez kod doładowania, ale to, że mój zawrót głowy. Wydaje się absurdem; takie marnotrawstwo i niepotrzebne. Co się dzieje?

Odpowiedz

10

Funkcja Boost próbuje utworzyć zestaw zakresów dla kontenerów, które są przekazywane, i kończy się wywoływanie range_detail::is_char_ptr(), która jest nazwą zestawu szablonów funkcji, które używa dedukcji parametrów szablonu w celu określenia, czy parametr jest wartością char wskaźnik jakiegoś rodzaju (nie tak jak można się domyślić).

Niestety, szablon funkcji "catch-all", który zwraca 0 przy dopasowywaniu parametrów innych niż char-pointer, przyjmuje parametr według wartości.

Myślę, że można to naprawić, zmieniając parametr, aby zamiast niego wybrać const&. Spójrz w pliku boost/range/as_literal.hpp dla:

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

i zmień ją na:

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

jestem bynajmniej ekspertem w realizacji skomplikowanych bibliotek szablonów (używam 'em, I don' t napisać 'em), więc nie twierdzę, że ta zmiana nie spowoduje innego nieprzyjemnego efektu ubocznego.

+4

Zobacz zgłoszenie błędu dotyczące tego problemu na stronie https://svn.boost.org/trac/boost/ticket/6149. –

+1

Ta poprawka znajduje się teraz w bagażniku boost i powinna być częścią wersji 1.50: https://svn.boost.org/trac/boost/ticket/6149#comment:2 –

Powiązane problemy