Вывод аргументов шаблона (использование как явных, так и неявных аргументов в одном вызове) - PullRequest
2 голосов
/ 24 января 2011

У меня есть три аргумента шаблона для функции, и у меня проблемы с (я думаю) компилятором, определяющим, какой аргумент шаблона есть какой.

Функция шаблона:

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

Однако, если я использую встроенный тип, такой как int или float, для параметра P, все компилируется нормально.

, например * * 1016

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

Так что мой вопрос в том, что я здесь делаю неправильно, как я могу лучше сообщить компилятору, какой параметр какой, или я совершенно не в курсе?

Ответы [ 3 ]

1 голос
/ 24 января 2011

Я не хочу отвечать на свой вопрос, но проблема заключалась в том, что клик :: DisjointSubsetForest на самом деле является шаблонным классом, поэтому

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

работает

0 голосов
/ 24 января 2011

Я попытался воспроизвести ошибку на простом примере, но мне не удалось это сделать (на 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;
};
0 голосов
/ 24 января 2011

"ошибка: нет подходящей функции для вызова‘ find_optimal_partition_louvain (клик :: График &, клик :: find_linearised_stability) "

Казалось бы, ваш компилятор считает, что cliques :: Graph - это не шаблон.

...