问题描述
据我所知,当存在没有完整类型规范的前向声明时,会发生不完整类型错误,然后实例化该类型,因为编译器无法判断此类类型的大小。 就我而言,我不明白这段代码如何产生这样的问题。为简单起见,我删除了不相关的部分。
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.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::tuple
替换 tbb::flow::tuple
,但我没有研究如何使用 TBB 元组。