C++ tbb 流程图,multifunction_node 给出不完整的类型错误

问题描述

据我所知,当存在没有完整类型规范的前向声明时,会发生不完整类型错误,然后实例化该类型,因为编译器无法判断此类类型的大小。 就我而言,我不明白这段代码如何产生这样的问题。为简单起见,我删除了不相关的部分。

class FilterOnNode {
   struct PartialResult { int n1,n2; long e; };
   typedef PartialResult* InputResult;
   typedef tbb::flow::multifunction_node<InputResult,InputResult> FilterNodeType;

   void BuildGraph(tbb::flow::graph &g,tbb::flow::graph_node &src) {
       auto sampleNode = FilterNodeType(
                g,tbb::flow::concurrency::unlimited,[&](const InputResult &input,typename FilterNodeType::output_ports_type &op) { //error points to here
                    //some logic here... might not send message.
                    std::get<0>(op).try_put(input);
                });
       tbb::flow::make_edge(src,sampleNode);
       //create couple other nodes like prevIoUs then connect edges
       tbb::flow::make_edge(tbb::flow::output_port<0>(sampleNode),otherNode);
   }

编译器在 lambda 表达式中给出不完整类型的错误。确切的错误说:

/usr/local/include/tbb/flow_graph.h:1568:7: error: incomplete type ‘std::tuple_size<FilterOnNode::PartialResult*>’ used in nested name specifier class multifunction_node

PartialResult 类型不是已经完全指定了吗?试着把它从课堂上拿掉,但还是一样的问题。

解决方法

PartialResult 类型不是已经完全指定了吗?

是的,但这不是错误消息所抱怨的。错误消息应该读作“错误:不完整类型'[不完整类型的名称]'使用了[使用地点]”.不完整的类型是 std::tuple_size<FilterOnNode::PartialResult*>,而不是 PartialResult。当 std::tuple_size<T> 是指针(例如 T)时,没有 PartialResult* 的定义。

不完整类型的使用位置与class multifunction_node有关。我环顾四周寻找定义它的标题,发现以下内容。 (我不知道为什么我找到的 API 文档中没有这些信息。)

tbb/flow_graph.hmultifunction_node 定义的开头:

//! implements a function node that supports Input -> (set of outputs)
// Output is a tuple of output types.
template<typename Input,typename Output,typename Policy = queueing>
class multifunction_node :

因此 Output 参数必须是输出类型的元组,但您提供了原始输出类型。尝试将 FilterNodeType 的定义更改为以下内容。

typedef tbb::flow::multifunction_node<InputResult,std::tuple<InputResult>> FilterNodeType;
//                                                 ^^^^^^^^^^^           ^

可能可以用 std::tuple 替换 tbb::flow::tuple,但我没有研究如何使用 TBB 元组。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...