C++ 模板参数推断(在同一调用中同时使用显式和隐式参数)
我对一个函数有三个模板参数,并且(我认为)编译器在推断哪个模板参数是哪个模板参数时遇到了麻烦 模板功能是:C++ 模板参数推断(在同一调用中同时使用显式和隐式参数),c++,templates,metaprogramming,function-templates,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<
#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;
}
}
#包括
#包括
名称空间集团
{
模板
P find_optimal_partition_louvain(团::图&我的图),
质量功能(QF)
{
P假人;
}
}
当我试着打电话给你的时候
cliques::find_optimal_partition_louvain<cliques::DisjointSetForest>(my_new_graph, cliques::find_linearised_stability(current_markov_time));
cliques::find_optimal_partition_louvain(我的新图,cliques::find_linearized_stability(当前马尔可夫时间));
其中,模板参数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(我的新图,cliques::find_linearized_stability(当前马尔可夫时间));
所以我的问题是我在这里做错了什么,我怎样才能更好地告诉编译器哪个参数是哪个,或者我完全偏离了轨道 “错误:没有匹配函数用于调用'find_optimal_partition_louvain'(团::图&,团::find_linearized_stability)”
您的编译器似乎认为cliques::Graph不是一个模板。我曾尝试在一个简单的示例中重现该错误,但(在gcc上)没有成功 看起来编译器确实发现
find\u optimal\u partition\u louvain
是一个函数模板。我建议尝试以下方法:
cliques::template find_optimal_partition_louvain<cliques::DisjointSetForest>(my_new_graph, cliques::find_linearised_stability(current_markov_time));
cliques::template find_optimal_partition_louvain(我的新图,cliques::find_linearized_stability(当前马尔可夫时间));
否则,您可能需要验证以下简单示例在您的编译器上是否编译良好(因为它应该!)
#包括
模板
结构条{};
名称空间Foo{
模板
一个some_函数(Bar&,C aFunc){
aFunc();
返回A();
};
};
结构HW打印机{
HWPrinter(){std::cout我不想回答我自己的问题,但问题是cleques::DisjointSubsetForest实际上是一个模板化类,所以
cliques::find_optimal_partition_louvain<cliques::DisjointSetForest<int> >(my_new_graph, cliques::find_linearised_stability(current_markov_time));
cliques::find_optimal_partition_louvain(我的新图,cliques::find_linearized_stability(当前马尔可夫时间));
works这是问题中的一个格式错误。我现在已经修复了它。Base本来是bar的,但现在它编译得很好。我不确定你的示例和我的示例有什么不同。我知道,我试图使这个简单的示例尽可能接近你的问题,但它只是没有重现错误……这可能很愚蠢,但是,你可能s忘记了一个#include?为了便于参考,指定您正在使用的编译器会很有帮助
#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;
};
cliques::find_optimal_partition_louvain<cliques::DisjointSetForest<int> >(my_new_graph, cliques::find_linearised_stability(current_markov_time));