c++ - 模板类方法中的递归 std::function 定义

标签 c++ recursion c++14 std-function

对于模板类声明:

enum class traversal_order {PREORDER, INORDER, POSTORDER};

template<typename T1>
class node{

//public and private members


};

template<typename T1, typename T2>
class tree{

//rest of template
public:
using sp2node_cont = vector<shared_ptr<node<T1>>>;
using r_iter_sp2node_cont = typename vector<shared_ptr<node<T1>>>::iterator&;

public:

tree(T2 const&, size_t);
void traversal_tree(traversal_order);

//rest of template

private:
sp2node_cont impl_tree;

};

而对于模板方法的定义如下:

template<typename T1, typename T2>
tree<T1,T2>::traverse_tree(traversal_order D){

switch(D){

   case PREORDER:
   {
     function<void(r_iter_sp2node_cont,r_iter_sp2node_cont)>
     print_preorder = [&] (r_iter_sp2node_cont begin,
                           r_iter_sp2node_cont end
                          ){

             //rest of the definition

            print_preorder(std::next(begin), end);

     };

     print_preoder(impl_tree.begin(), impl_tree.end());

   break;


    }


  }

}

当从 main() 调用时,编译器为 std::function print_preorder() 的递归调用生成以下错误,如下所示:

std::array<string,25> A;
//rest of the code
tree<string, decltype(A)> a_tree(A,A.size());
a_tree.traverse_tree(traversal_order::PREORDER);




   1 In file included from main.cpp:1:
   2 ./bt.hpp:306:21: error: no matching function for call to object of type         'function<void (r_iter_sp2node_cont, r_iter_sp2node_cont)>' (aka                'function<void (__wrap_iter<std::__1::shared_ptr<node<std::__1::                basic_string<char> > > *> &, __wrap_iter<std::__1::shared_ptr<node<std::        __1::basic_string<char> > > *> &)>')
   3                     print_preorder(next(begin), end);
   4                     ^~~~~~~~~~~~~~ 
   5 main.cpp:23:12: note: in instantiation of member function 'tree<std::__1::      basic_string<char>, std::__1::array<std::__1::basic_string<char>, 25> >::       traverse_tree' requested here 
   6     a_tree.traverse_tree(traversal_order::PREORDER);
   7            ^
   8 /Library/Developer/CommandLineTools/usr/include/c++/v1/functional:1667:9:       note: candidate function not viable: expects an l-value for 1st argument
   9     _Rp operator()(_ArgTypes...) const;
  10         ^       
  11 1 error generated.

我不确定如何解决这个错误。有什么建议吗?

最佳答案

你的问题在这一行

using r_iter_sp2node_cont = typename vector<shared_ptr<node<T1>>>::iterator&;

您已将 r_iter_sp2node_cont 定义为对迭代器的引用。

所以print_preorder的签名是

print_preorder(vector...::iterator&, vector...::iterator&)

但是当你打电话的时候

print_preorder(impl_tree.begin(), impl_tree.end());

vector begin()end() 方法返回 iterator 对象。您不能将这些成员函数返回的临时 iterator 对象传递给需要引用迭代器 iterator& 的函数。

您应该从定义 r_iter_sp2node_cont 类型中删除 &

附言。 您的代码可以在具有扩展名的 MSVC 下编译,并且可以将临时对象传递给期望引用对象 void foo(anObject&) 的函数。

关于c++ - 模板类方法中的递归 std::function 定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48704295/

相关文章:

c++ - CRect 和 CRect* 如何成为 GetClientRect 的输入参数?

c++ - 为什么 std::future::wait_for 不等待正确的持续时间?

java - 数字金字塔,初学递归追踪难吗?

c++ - 在 n 处计算六次独立运行的斐波那契数的最大和最小时间

c++ - 带有大括号初始化的 make_unique

c++:在方法中组合自动和右值时出现gcc错误?

c++ - std::unordered_set 是否连续(如 std::vector)?

c++ - 一个通用的集合操作类,即交集、并集、减号等

node.js - 找到所需文件后,如何立即停止递归搜索目录?

c++ - 将不同的lambdas传递给c++中的函数模板