Boost multiindex容器不能使用泛型类型进行编译

时间:2017-02-06 12:38:03

标签: c++ templates generics visual-c++ boost-multi-index

我试图利用boost-multiindex容器进行快速和位置访问。同时提供std::vectorstd::map之类的内容。我构建一个简单的boost-multiindex类没有问题。它工作得非常整洁。

问题出现了,因为我试图将我的玩具示例传递给我的真实代码。我计划在通用树结构中使用boost-multiindex,其中可以设置要存储的值的类型T以及用于存储指向节点Node的指针的容器。同时。

由于某些原因,无论我尝试过什么,注释代码都不会运行。我也无法理解编译器错误消息。 : - (

我想这应该是一个简单的问题,但我不知道该怎么做。

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/sequenced_index.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/mem_fun.hpp>
#include <boost/timer/timer.hpp>

struct Node {
    const std::string& name() const { return mName; }

    std::string mName;
};

// @brief Knoten des allgemeinen Baums, welcher Werte vom Typ T enthält.
template<typename T, template <typename Node = GenericTreeNode<T>> typename C>
    struct GenericTreeNode {
        typedef GenericTreeNode<T, C> self_type;
        typedef T value_type;
        typedef C<self_type> cont_type;

        const std::string& name() const { return name_; }

        std::string name_;
        value_type value_;
        cont_type kids_;
    };

template<typename Node>
using BoostCont =
boost::multi_index::multi_index_container<
    Node*,
    boost::multi_index::indexed_by<
        boost::multi_index::ordered_unique<
            boost::multi_index::const_mem_fun<Node, const std::string&, &Node::name> 
        >,
        boost::multi_index::sequenced<>
    >
>;

int main() {
    // Does not not compile!
    // GenericTreeNode<int, BoostCont> node;
    // node.kids_.insert(new GenericTreeNode<int, BoostCont>());

    // Compiles 
    BoostCont<Node> test;
    test.insert(new Node{ "B" });
    test.insert(new Node{ "A" });
    test.insert(new Node{ "C" });
    for (auto iter : test) {
        std::cout << iter->mName << std::endl;
    }
}

我会收到错误消息:

error C2039: "name": Is not an element of "GenericTreeNode<int,BoostCont>"
error C2065: "name": undeclared identifier
error C2975: "PtrToMemberFunction": Invalid template argument for "boost::multi_index::const_mem_fun", constant compile time expression expected

0 个答案:

没有答案