Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板参数推断(在同一调用中同时使用显式和隐式参数)_C++_Templates_Metaprogramming_Function Templates - Fatal编程技术网

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));