如何通过函数指针递归调用一个类成员函数?

问题描述 投票:0回答:1

我正在编写一个库,用于在树状对象上运行某些算法。 我有一个 edge_t 阶级,具有 const unsigned int 数据成员 edge_idweight 分别作为 edge_t的唯一标识符和边缘的重量。

我写了 tree_tsubtree_t 类,这两个类都包含了对指向 edge_ts. 两者 tree_tsubtree_t 都是由一个抽象的 basic_tree_t 类,该类包含了树状对象应该具有的所有功能,包括以下方法。

// returns the sum of the weights of the edge_ts below the edge_t pointed to by edge_ptr
unsigned int basic_tree_t::weight(const edge_ptr) const

// returns the number of edge_ts below the edge_t pointed to by edge_ptr
unsigned int basic_tree_t::num_descendents(const edge_ptr) const

我正在写一些其他的代码,其中用户输入一个... tree_t 对象,而代码必须迭代地采样一个 subtree_t 从它身上,做一些计算,采样另一个 subtree_t,做更多的计算,以此类推。 为了进行计算,代码需要知道以下的值 weightnum_descendents 为这些子树中的每一条边计算。

为了避免重复计算相同的值,每次建立一个新的子树时,我都会建立 std::map<unsigned int, unsigned int> weight_mapstd::map<unsigned int, unsigned int> num_descendents_map,它映射了每个 edge_id 子树的边的值与子树中各成员函数输出的值的关系。basic_tree_t 然后用这些来工作。 我写了以下函数来填充这些地图。

void populate_weight_map(subtree_t & S, edge_ptr & e, std::map<unsigned int, unsigned int> & weight_map)
{
        weight_map.insert(std::pair<unsigned int, unsigned int>(e->edge_id, S.weight(e)));
        for (auto & c : *(e->children))
                if (S.contains(c))
                        populate_weight_map(S, c, weight_map);
}

void populate_num_descendents_map(subtree_t & S, edge_ptr & e, std::map<unsigned int, unsigned int> & num_descendents_map)
{
        num_descendents_map.insert(std::pair<unsigned int, unsigned int>(e->edge_id, S.num_descendents(e)));
        for (auto & c : *(e->children))
                if (S.contains(c))
                        populate_weight_map(S, c, num_descendents_map);
}

这些函数基本上是一样的 所以我觉得写一个函数更有意义 因为这个函数需要一个指向相关地图的指针。basic_tree_t 成员函数作为第四个参数,类似这样。

void populate_map(subtree_t & S, edge_ptr & e, std::map<unsigned int, unsigned int> & m, unsigned int (basic_tree_t::*f)(const edge_ptr) const)
{
        m.insert(std::pair<unsigned int, unsigned int>(e->edge_id, (S.*f)(e)));
        for (auto & c : *(e->children))
                if (S.contains(c))
                        populate_map(S, c, m, &basic_tree_t::*f); // ERROR ON THIS LINE!
}

然而,编译器在最后一行返回一个不透明的错误。

error: expected unqualified-id
                    populate_map(S, c, m, &basic_tree_t::*f);
                                                         ^

第四参数应该是什么 populate map 是吗?

c++ recursion member-function-pointers
1个回答
3
投票

f 已经是指向所需成员的指针了,所以只需要传递这个。

populate_map(S, c, m, f);

&basic_tree_t::*f 在这种情况下是没有意义的。 它看起来像一个尝试 申报 指针 资料 成员,反正这不是你想要的。

© www.soinside.com 2019 - 2024. All rights reserved.