Я пытаюсь скомпилировать 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 );
}