为什么我的 boost::multi_index modify() 没有编译?
Why isn't my boost::multi_index modify() compiling?
我正在使用boost::multi_index_container
,并试图让modify
操作正常工作。 我的修改例程看起来像这样(大致),使用函数内部类:
void FooContainer::modifyAttribute(string key, int newValue) {
struct ModifyFunc {
int val;
ModifyFunc(int val): val(val) {}
void operator()(Foo &f) {
foo.val = val;
}
};
StorageContainer::index<keyTag>::type &idx = mContainer.get<keyTag>();
StorageContainer::index<keyTag>::type::iterator iter = idx.find(key);
idx.modify(iter, ModifyFunc(newValue));
}
当我尝试编译它时,我得到了这样的多页编译器错误(大部分被省略):
FooContainer.cpp:##: error: no matching function for call to [...]::modify([...]&, FooContainer::modifyAttribute(string,int)::ModifyFunc)’
此调用有什么问题,如何使其工作?
问题是编译器无法将函数内部类识别为模板参数的有效类型名; 这并不明显,但 multi_index_container::index<T>::type::modify
方法使用 modify 参数的类型作为模板参数,这是一个通常隐藏在视图中的细节。 但是,请查看其声明,例如boost/multi_index/hashed_index.hpp
:
template<typename Modifier>
bool modify(iterator position,Modifier mod)
简单的解决方法是使ModifyFunc
结构不是函数内部类;简单来说,使其成为FooContainer
内部而不是FooContainer::modifyAttribute
方法。 当然,这也意味着您可以在其他地方重用 ModifyFunc
类,如果事实证明您在多个地方需要它。