2016-01-16 2 views
0

Так что это очень странное поведение, которое я не понимаю. У меня есть:Аргумент 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)); 
    } 

Тем не менее, мне очень любопытно, что происходит ?!

+0

Вы уверены, что после этого нет другой строки, в которой говорится, что «кандидат - это функция с двумя аргументами»? – immibis

ответ

1

And why it interpreted the node as Node& ?

Это красная сельдь. Это способ компилятора показать категорию значений второго аргумента (который является lvalue, поэтому &).


Действительная проблема заключается в том, что в функции-члена класса член Node::apply скрывает функциональные пространства имен сфера шаблонов одного и того же имени. Если вы хотите позвонить последнему, позвоните по следующему адресу:

return mynamespace::apply<GreaterThan>(Node(this), node); 
+0

Да, это было правильно, из-за того, как отправляется функция-член. –

Смежные вопросы