[英]C++ overloading the equality operator. Should I write my function to accept argument passed by reference or value?
[英]C++ argument should be passed by value, but compiler sees it as reference
因此,这是我不理解的非常奇怪的行为。 我有:
template <typename T>
Node Node::apply() {
return ptr->graph->derived_node(std::make_shared<T>(ptr->graph, this));
}
template <typename T>
Node apply(Node parent1, Node parent2){
GraphInPtr graph = parent1.ptr->graph;
return graph->derived_node(std::make_shared<T>(graph, parent1, parent2));
}
template <typename T>
Node apply(NodeVec parents){
GraphInPtr graph = parents[0].ptr->graph;
return graph->derived_node(std::make_shared<T>(graph, parents));
}
我也有这个:
Node gt(Node node1, Node node2){
return apply<GreaterThan>(node1, node2);
}
但是,这在编译时会出现错误:
Node Node::gt(Node node) {
return apply<GreaterThan>(Node(this), node);
}
错误是:
error: no matching function for call to ‘metadiff::Node::apply(metadiff::Node, metadiff::Node&)’
return apply<GreaterThan>(Node(this), node);
note: candidate is:
note: template<class T> metadiff::Node metadiff::Node::apply()
Node Node::apply()
因此由于某种原因,它试图调用Node::apply()
而不是apply(Node node1, Node node2)
,但是我不明白为什么? 为什么将节点解释为Node&
?
有趣的是,它起作用了:
Node Node::gt(Node node) {
// return apply<GreaterThan>(Node(this), node);
GraphInPtr graph = ptr->graph;
return graph->derived_node(std::make_shared<GreaterThan>(graph, this, node));
}
不过,我很好奇发生了什么事!
为什么将节点解释为
Node&
?
那是一条红鲱鱼。 这是编译器显示第二个参数的值类别的方法(它是一个左值,所以&
)。
您的实际问题是在成员函数中,类成员Node::apply
隐藏了具有相同名称的名称空间范围函数模板。 如果要呼叫后者,请限定呼叫:
return mynamespace::apply<GreaterThan>(Node(this), node);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.