Так что это очень странное поведение, которое я не понимаю. У меня есть:Аргумент C++ должен передаваться по значению, но компилятор видит его в качестве ссылки
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));
}
Тем не менее, мне очень любопытно, что происходит ?!
Вы уверены, что после этого нет другой строки, в которой говорится, что «кандидат - это функция с двумя аргументами»? – immibis