struct Block {
size_t start;
size_t end;
bool operator==(const Block& b) const {
return start == b.start && end == b.end;
}
};
namespace std {
template
struct hash {
size_t operator()(const Block& b) const {
return b.start;
}
};
}
< /code>
При попытке получить доступ к карте я получаю следующее сообщение об ошибке в GDB (то же самое для G ++ 4.7.1, а также Clang ++ 3.1): < /p>
Program received signal SIGFPE, Arithmetic exception.
0x0000000000401e0b in std::__detail::_Mod_range_hashing::operator() (this=0x7fffffffd8e0, __num=0, __den=0)
at /usr/include/c++/4.7/bits/hashtable_policy.h:245
245 { return __num % __den; }
< /code>
my libstdc ++ версия - 3.4.17 (то есть версия от GCC 4.7) < /p>
Соответствующая Backtrace: < /p>
#0 0x0000000000401e0b in std::__detail::_Mod_range_hashing::operator() (this=0x7fffffffd8e0, __num=0, __den=0)
at /usr/include/c++/4.7/bits/hashtable_policy.h:245
#1 0x0000000000407199 in std::__detail::_Hash_code_base::_M_bucket_index (this=0x7fffffffd8e0, __c=0, __n=0) at /usr/include/c++/4.7/bits/hashtable_policy.h:787
#2 0x0000000000405230 in std::_Hashtable::_M_bucket_index
(this=0x7fffffffd8e0, __k=..., __c=0) at /usr/include/c++/4.7/bits/hashtable.h:466
#3 0x00000000004038de in std::__detail::_Map_base::at (
this=0x7fffffffd8e0, __k=...) at /usr/include/c++/4.7/bits/hashtable_policy.h:474
#4 0x0000000000403001 in SplicedAlignment::FindOptimalEndBlock() const::{lambda(Block const&)#1}::operator()(Block const&) const (__closure=0x7fffffffd990, block=...) at splicing.cpp:151
#5 0x00000000004040b3 in std::for_each(__gnu_cxx::__normal_iterator, SplicedAlignment::FindOptimalEndBlock() const::{lambda(Block const&)#1}, SplicedAlignment::FindOptimalEndBlock() const::{lambda(Block const&)#1}) (__first=..., __last=..., __f=...)
at /usr/include/c++/4.7/bits/stl_algo.h:4442
Редактировать: я не думал, что на самом деле это изменит , где я называю функцию до тех пор, пока я даю ей те же аргументы, но, очевидно, это делает : < /p>
У меня есть Unoromeded_map с блоком, является простой структурой, определенной следующим образом: [code]struct Block { size_t start; size_t end;
bool operator==(const Block& b) const { return start == b.start && end == b.end; } };
namespace std { template struct hash { size_t operator()(const Block& b) const { return b.start; } }; } < /code> При попытке получить доступ к карте я получаю следующее сообщение об ошибке в GDB (то же самое для G ++ 4.7.1, а также Clang ++ 3.1): < /p> Program received signal SIGFPE, Arithmetic exception. 0x0000000000401e0b in std::__detail::_Mod_range_hashing::operator() (this=0x7fffffffd8e0, __num=0, __den=0) at /usr/include/c++/4.7/bits/hashtable_policy.h:245 245 { return __num % __den; } < /code> my libstdc ++ версия - 3.4.17 (то есть версия от GCC 4.7) < /p> Соответствующая Backtrace: < /p> #0 0x0000000000401e0b in std::__detail::_Mod_range_hashing::operator() (this=0x7fffffffd8e0, __num=0, __den=0) at /usr/include/c++/4.7/bits/hashtable_policy.h:245 #1 0x0000000000407199 in std::__detail::_Hash_code_base::_M_bucket_index (this=0x7fffffffd8e0, __c=0, __n=0) at /usr/include/c++/4.7/bits/hashtable_policy.h:787 #2 0x0000000000405230 in std::_Hashtable::_M_bucket_index (this=0x7fffffffd8e0, __k=..., __c=0) at /usr/include/c++/4.7/bits/hashtable.h:466 #3 0x00000000004038de in std::__detail::_Map_base::at ( this=0x7fffffffd8e0, __k=...) at /usr/include/c++/4.7/bits/hashtable_policy.h:474 #4 0x0000000000403001 in SplicedAlignment::FindOptimalEndBlock() const::{lambda(Block const&)#1}::operator()(Block const&) const (__closure=0x7fffffffd990, block=...) at splicing.cpp:151 #5 0x00000000004040b3 in std::for_each(__gnu_cxx::__normal_iterator, SplicedAlignment::FindOptimalEndBlock() const::{lambda(Block const&)#1}, SplicedAlignment::FindOptimalEndBlock() const::{lambda(Block const&)#1}) (__first=..., __last=..., __f=...) at /usr/include/c++/4.7/bits/stl_algo.h:4442 [/code] Редактировать: я не думал, что на самом деле это изменит , где я называю функцию до тех пор, пока я даю ей те же аргументы, но, очевидно, это делает : < /p> [code]std::for_each(blocks.begin(), blocks.end(), [&](const Block& block) { map.at(block); } < /code> приводит к ошибке, а просто: < /p> const Block& block = blocks[0]; map.at(block); < /code> работает совершенно нормально (blocks[/code] быть простым вектором & )