2011-01-24 54 views
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應該對應於拉幫結派:: DisjointSetForest,和正常功能參數是一個模板化類和函數對象。

此失敗

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

但是如果我使用內建類型如int或浮法用於P參數一切編譯罰款。

例如

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

所以我的問題是我在做什麼錯在這裏,我怎麼能使用更好的告訴編譯器哪個參數是哪個,還是我完全偏離了軌道?

+0

爲了參考起見,指定您正在使用的編譯器會有所幫助。 編輯:沒關係,在下面的評論中指定的「g ++ 4.4.3」 – 2011-01-24 21:16:16

回答

1

我不想回答我自己的問題,但問題是,拉幫結派:: DisjointSubsetForest實際上是一個模板類,所以

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

作品

0

「錯誤:調用「find_optimal_partition_louvain(派系::圖&,拉幫結派:: find_linearised_stability)沒有匹配功能」

這似乎是你的編譯器認爲拉幫結派::圖形是不是一個模板。

+0

這是一個格式錯誤的問題。我現在修好了。 – interjay 2011-01-24 18:48:54

0

我試圖重現一個簡單的例子上的錯誤,但我沒有這樣做(在海灣合作委員會)。

它看起來好像編譯器確實知道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; 
}; 
+0

我正在使用g ++ 4.4.3 – zenna 2011-01-24 19:05:53

相關問題