C++ tbb 流程图,multifunction_node 给出不完整的类型错误
C++ tbb flow graph, multifunction_node giving incomplete type error
据我了解,不完整的类型错误发生在没有完整类型说明的前向声明中,然后实例化该类型,因为编译器无法判断此类类型的大小。
就我而言,我不明白这段代码是如何产生这样的问题的。为简单起见,我删除了不相关的部分。
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 类型不是已经完全指定了吗?尝试将其从 class 中取出,但问题仍然存在。
Isn't the type PartialResult fully specified already?
是的,但这不是错误消息所抱怨的。报错信息应该读作"error: incomplete type '[name of the incomplete type]' used [place where it is used]"。不完整的类型是std::tuple_size<FilterOnNode::PartialResult*>
,不是PartialResult
。当 T
是一个指针(例如 PartialResult*
)时,没有 std::tuple_size<T>
的定义。
不完全类型的使用位置与class multifunction_node
有关。我环顾四周寻找定义它的 header 并发现了以下内容。 (我不知道为什么我找到的 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;
// ^^^^^^^^^^^ ^
也许可以用 tbb::flow::tuple
替换 std::tuple
,但我没有研究如何使用 TBB 元组。
据我了解,不完整的类型错误发生在没有完整类型说明的前向声明中,然后实例化该类型,因为编译器无法判断此类类型的大小。 就我而言,我不明白这段代码是如何产生这样的问题的。为简单起见,我删除了不相关的部分。
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 类型不是已经完全指定了吗?尝试将其从 class 中取出,但问题仍然存在。
Isn't the type PartialResult fully specified already?
是的,但这不是错误消息所抱怨的。报错信息应该读作"error: incomplete type '[name of the incomplete type]' used [place where it is used]"。不完整的类型是std::tuple_size<FilterOnNode::PartialResult*>
,不是PartialResult
。当 T
是一个指针(例如 PartialResult*
)时,没有 std::tuple_size<T>
的定义。
不完全类型的使用位置与class multifunction_node
有关。我环顾四周寻找定义它的 header 并发现了以下内容。 (我不知道为什么我找到的 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;
// ^^^^^^^^^^^ ^
也许可以用 tbb::flow::tuple
替换 std::tuple
,但我没有研究如何使用 TBB 元组。