模板参数推导(在同一个调用中使用显式和隐式参数)

时间:2011-01-24 18:29:35

标签: c++ templates metaprogramming function-templates

我有一个函数的三个模板参数,并且遇到麻烦(我认为)编译器推断出哪个模板参数是哪个。

模板功能是:

#include <structures/partition.h>
#include <vector>

namespace cliques
{
    template <typename P, typename T, typename QF>
    P find_optimal_partition_louvain(cliques::Graph<T> &my_graph,
                                    QF quality_function)
    {

        P dummy;

    }

}

当我尝试用

调用它时
cliques::find_optimal_partition_louvain<cliques::DisjointSetForest>(my_new_graph, cliques::find_linearised_stability(current_markov_time));

其中模板参数P应对应于cliques :: DisjointSetForest,而普通函数参数是模板化类和函数对象。

失败
error: no matching function for call to
find_optimal_partition_louvain(cliques::Graph<lemon::ListGraph>&,
cliques::find_linearised_stability)

但是,如果我为P参数使用内置类型(如int或float),则编译得很好。

e.g。

cliques::find_optimal_partition_louvain<int>(my_new_graph, cliques::find_linearised_stability(current_markov_time));

所以我的问题是我在这里做错了什么,我怎样才能更好地告诉编译器哪个参数是哪个,还是我完全偏离轨道?

3 个答案:

答案 0 :(得分:1)

我不想回答我自己的问题,但问题是cliques :: DisjointSubsetForest实际上是一个模板化的类,所以

cliques::find_optimal_partition_louvain<cliques::DisjointSetForest<int> >(my_new_graph, cliques::find_linearised_stability(current_markov_time));

作品

答案 1 :(得分:0)

“错误:没有匹配函数来调用'find_optimal_partition_louvain(cliques :: Graph&amp;,cliques :: find_linearised_stability)”

您的编译器似乎认为cliques :: Graph不是模板。

答案 2 :(得分:0)

我试图在一个简单的例子中重现错误,但我没有这样做(在gcc上)。

看起来编译器确实发现find_optimal_partition_louvain是一个函数模板。我建议尝试以下方法:

cliques::template find_optimal_partition_louvain<cliques::DisjointSetForest>(my_new_graph, cliques::find_linearised_stability(current_markov_time));

否则,您可能想要验证以下简单示例是否在编译器上编译正确(因为它应该!):

#include <iostream>

template <class G>
struct Bar { };

namespace Foo {

template <class A, class B, class C>
A some_function(Bar<B>&, C aFunc) {
  aFunc();
  return A();
};

};

struct HWPrinter {
  HWPrinter() { std::cout << "Hello World!" << std::endl; };
};

struct IntPrinter {
  int value;
  IntPrinter(int aValue) : value(aValue) { };
  void operator() () { std::cout << "The integer is: " << value << std::endl; };
};

int main() {
  Bar<HWPrinter> ab;

  Foo::some_function<HWPrinter>(ab,IntPrinter(42));

  return 0;
};