Кеш-таблица Google Code на VC 2005 - PullRequest
2 голосов
/ 12 февраля 2009

Я пытаюсь скомпилировать Google кеш-таблицу с помощью Visual Studio 2005 и остается одна проблема:

\ mm \ cache_table.hpp (734): ошибка C2780: 'void std :: _ Destroy (_Ty *)': ожидается 1 аргумент - 2 предоставлено
c: \ arquivos de programas \ Microsoft Visual Studio 8 \ vc \ include \ xmemory (58): см. объявление 'std :: _ Destroy'
\ mm \ cache_table.hpp (714): при компиляции функции-члена шаблона класса 'void mm :: cache_table
:: resize (mm :: cache_table :: size_type) '
с
[
& EnSP; & EnSP; & EnSP; Value = станд :: строка,
& EnSP; & EnSP; & EnSP; Key = станд :: строка,
& ENSP; & EnSP; & EnSP; DiscardFunction = DiscardLog,
& EnSP; & EnSP; & EnSP; = мм хэш-функцию :: хэш <станд :: строка>,
& EnSP; & EnSP; & EnSP; KeyEqual = станд :: equal_to <станд :: строка>,
& EnSP; & EnSP; & EnSP; KeyExtract = мм :: Идентичность <станд :: строка>,
& EnSP; & EnSP; & EnSP; Allocator = станд :: Распределитель <станд :: строка>
]
\ mm \ cache_set.hpp (122): см. компилируемую ссылку на создание шаблона класса 'mm :: cache_table <значение, ключ, DiscardFunction, HashFunction, KeyEqual, KeyExtract, Allocator>'
с
[
& EnSP; & EnSP; & EnSP; Value = станд :: строка,
& EnSP; & EnSP; & EnSP; Key = станд :: строка,
& ENSP; & EnSP; & EnSP; DiscardFunction = DiscardLog,
& EnSP; & EnSP; & EnSP; = мм хэш-функцию :: хэш <станд :: строка>,
& EnSP; & EnSP; & EnSP; KeyEqual = станд :: equal_to <станд :: строка>,
& EnSP; & EnSP; & EnSP; KeyExtract = мм :: Идентичность <станд :: строка>,
& EnSP; & EnSP; & EnSP; Allocator = станд :: Распределитель <станд :: строка>
]
\ cache_table_google.cpp (48): см. компилируемую ссылку на создание шаблона класса 'mm :: cache_set '
с
[
& EnSP; & EnSP; & EnSP; Value = станд :: строка,
& EnSP; & EnSP; & EnSP; = мм хэш-функцию :: хэш <станд :: строка>, * * тысяча тридцать-пять & EnSP; & EnSP; & EnSP; KeyEqual = станд :: equal_to <станд :: строка>,
& EnSP; & EnSP; & EnSP; DiscardFunction = DiscardLog
]

В заголовке Я не нахожу шаблон для _Destroy с 2 параметрами.

Есть предложения?


Я сделал открытие, вероятно, API использовался в SGI STL. Я прогрессирую.


Решение:

Внести изменения (для выпуска cache-table-0.2.tar.gz)

at \ mm \ hash_fun.hpp:
- включить заголовок: #include

at \ mm \ cache_table.hpp:

  • внести изменения в функции

    void resize( size_type size )
    {
        size_t new_size = round_to_power2( size );
        size_t old_size = m_buckets;

        if ( new_size == old_size )
        {
            // Do nothing
            return;
        }
        else if ( new_size < old_size )
        {
            // The new table will be smaller, so there's no need to rehash
            // all the items.
            value_type* new_table;
            new_table = m_allocator.allocate( new_size * ItemSize );

            // Copy the elements that fit into the new table and destroy
            // those that doesn't fit.  Plain old memcpy seems to have much
            // less problems with types than std::copy..
            std::memcpy( new_table, m_table, new_size * ItemSize );

        //_Destroy( iterator( this, m_table + new_size, true ), m_end_it );

            for ( iterator First = iterator( this, m_table + new_size, true ); First != m_end_it; ++First) _Destroy(&First);


            m_allocator.deallocate( m_table, old_size );
            m_table = new_table;
            ...
            ...
            ...
  • и

    void clear()
    {
        // Call the destructor for all objects and reinitialize the memory.

        //_Destroy( begin(), end() );

        for ( iterator First = begin(); First != end(); ++First) 
                    _Destroy(&First);

        initialize_memory();
        m_num_elements = 0;
    }
  • и

    void erase( iterator first, iterator last )
    {
        m_num_elements -= mm::distance( first, last );
        //_Destroy( first, last );
        for ( ; first != last; ++first) 
                    _Destroy(&last);

        std::uninitialized_fill( first, last, m_empty_value );
    }
...