2

我有一个函数的三个模板参数,并且(我认为)编译器推断哪个模板参数是哪个有问题。

模板函数为:

#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 之类的内置类型,则一切都可以正常编译。

例如

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

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

4

3 回答 3

1

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

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

作品

于 2011-01-24T19:23:16.390 回答
0

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

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

于 2011-01-24T18:41:27.550 回答
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;
};
于 2011-01-24T18:56:09.700 回答