【问题标题】:Why isn't my boost::multi_index modify() compiling?为什么我的 boost::multi_index modify() 没有编译?
【发布时间】:2012-10-12 00:42:21
【问题描述】:

我正在使用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)’

这个调用有什么问题,我怎样才能让它工作?

【问题讨论】:

  • 只是出于好奇:如果您将operator() 声明为const,错误消息会改变吗?
  • 不。问题是函数内部类被用作模板参数,这是无效的,但编译器没有很好地确定名称解析以提供有意义的错误消息。在发帖之前我自己已经想通了(因此是自我回答的问题),但我认为这是一个足够晦涩的问题链,我应该在此处发布以防其他人对此感到困惑。

标签: c++ templates boost


【解决方案1】:

问题在于编译器无法将函数内部类识别为模板参数的有效类型名;这不是很明显,但multi_index_container::index&lt;T&gt;::type::modify 方法使用修改参数的类型作为模板参数,这是一个通常隐藏在视图中的细节。但是,请查看它在 boost/multi_index/hashed_index.hpp 中的声明:

template<typename Modifier>
bool modify(iterator position,Modifier mod)

简单的解决方法是使ModifyFunc 结构不是函数内部类;简单地说,将其设置为 FooContainer 而不是 FooContainer::modifyAttribute 方法的内部。当然,这也意味着您可以在其他地方重用 ModifyFunc 类,如果您在多个地方需要它的话。

【讨论】:

  • 就像一个小小的咆哮一样,如果 boost 将 Modifier 定义为一个抽象基类,而 modify() 将其作为一个 const 引用,那就太好了(尽管这会添加 const modify() 的要求,这将对一些晦涩的用例产生潜在影响)。
猜你喜欢
  • 2017-03-09
  • 2016-02-18
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
相关资源
最近更新 更多