-1

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

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 类型不是已经完全指定了吗?试着把它从课堂上拿出来,但仍然是同样的问题。

4

1 回答 1

1

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

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

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

tbb/flow_graph.h, 的定义开始multifunction_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::tupletbb::flow::tuple,但我没有研究如何使用 TBB 元组。

于 2021-01-30T03:28:03.457 回答