我有一个函数的三个模板参数,并且遇到麻烦(我认为)编译器推断出哪个模板参数是哪个。
模板功能是:
#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));
所以我的问题是我在这里做错了什么,我怎样才能更好地告诉编译器哪个参数是哪个,还是我完全偏离轨道?
答案 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;
};