【问题标题】:Candidate template ignored: deduced type does not match adjusted type [closed]候选模板被忽略:推导类型与调整类型不匹配[关闭]
【发布时间】:2018-01-23 10:09:36
【问题描述】:

boost图库中remove_edge的函数调用有一个很奇怪的问题。

当我在主函数中调用它时,编译和运行时都可以; 但是,当我在模板函数test_remove_edge 中调用它时,会出现编译错误。

代码示例和编译错误消息在这里。

#include <iostream>
#include <vector>
#include <string>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/max_cardinality_matching.hpp>
#include <boost/graph/maximum_weighted_matching.hpp>

using namespace boost;

template <typename Graph>
void test_remove_edge(const Graph& g)
{
   typedef typename graph_traits<Graph>::edge_iterator edge_iterator_t;

   edge_iterator_t ei, ei_end;
   for (boost::tie(ei,ei_end) = edges(g); ei != ei_end; ++ei)
   {
       std::cout << typeid(*ei).name() << ", " << typeid(g).name() << std::endl; // exactly same with the one in main
       remove_edge(*ei, g); // compile error, see message pasted below
   }
}

int main(int argc, const char * argv[])
{
    typedef property<edge_weight_t, float, property<edge_index_t, int>> EdgeProperty;
    typedef adjacency_list<vecS, vecS, undirectedS, no_property, EdgeProperty> my_graph;

    const int n_vertices = 8;

    my_graph g(n_vertices);

    add_edge(1,2,EdgeProperty(5),g);
    add_edge(0,4,EdgeProperty(1),g);
    add_edge(1,5,EdgeProperty(4),g);
    add_edge(2,6,EdgeProperty(1),g);
    add_edge(3,7,EdgeProperty(4),g);

   typedef typename graph_traits<my_graph>::edge_iterator edge_iterator_t;
   edge_iterator_t ei, ei_end;
   for (boost::tie(ei,ei_end) = edges(g); ei != ei_end; ++ei)
   {
       std::cout << typeid(*ei).name() << ", " << typeid(g).name() << std::endl; // exactly same with the one in test_remove_edge
       remove_edge(*ei, g); // compile ok, runtime ok
   }

    test_remove_edge(g);

    return 0;
}

编译错误消息:

候选模板被忽略:推导类型

'undirected_graph_helper >, boost::no_property, boost::listS>, boost::vecS, boost::vecS, boost::undirectedS, boost::no_property, 提升::属性 >, boost::no_property, boost::listS>::config> &'

第二个参数与调整后的类型不匹配

'const boost::adjacency_list >, boost::no_property, boost::listS>'

参数 [with EdgeOrIter = boost::detail::edge_desc_impl, 配置 = boost::detail::adj_list_gen >, boost::no_property, boost::listS>, boost::vecS, boost::vecS, boost::undirectedS, boost::no_property, 提升::属性 >, boost::no_property, boost::listS>::config]

我确信编译器会为这两种情况选择相同的重载函数remove_edge(Xcode 告诉我)。我也知道调用remove_edge时参数类型是相同的,通过检查typeid(T).name()的输出。

感到绝望,非常感谢任何帮助!

【问题讨论】:

  • 您将图表作为const&amp; 传递。但是你想改变它。所以我想如果你只是通过引用你的函数来传递它,它就会起作用。
  • @mkaes 哦,对对对,谢谢,我想给你买啤酒!!
  • 在这种情况下请考虑回答,@mkaes。现在这个问题将一直“悬而未决”,引起人们的注意。
  • @sehe:我宁愿投票结束这个问题,因为它对其他人没有任何好处。
  • 为什么不都@mkaes

标签: c++ templates boost graph


【解决方案1】:

remove_edge 修改图形,因此不能在 const-reference 上调用它。最简单的修复:

template <typename Graph> void test_remove_edge(Graph& g) {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 2013-03-14
    • 2013-10-05
    • 1970-01-01
    • 2012-09-15
    相关资源
    最近更新 更多