C ++参数应该通过值传递,但编译器将其视为引用

时间:2016-01-16 04:03:36

标签: c++ templates 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));
    }

尽管如此,我很好奇发生了什么事情?!

1 个答案:

答案 0 :(得分:1)

  

为什么它将节点解释为Node&

那是一只红鲱鱼。它是编译器显示第二个参数的值类别的方式(这是一个左值,所以&)。

您的实际问题是在成员函数中,类成员Node::apply隐藏了同名的命名空间范围函数模板。如果你想打电话给后者,请通电:

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