Я занимаюсь этим часами, но не могу найти способ решить эту проблему.Прежде чем спросить, это не домашний вопрос.
Итак, у меня есть два настраиваемых шаблонных класса с именами Matrix<T>
и Vector<T>
, и у меня есть эта функция с именем train(...)
, которая принимает std::vector<VectorT<T>*>&
называется X
и std::vector<Matrix<T>*>&
называется Generators
вместе с несколькими другими шаблонными параметрами.Эта функция описана ниже:
template <typename Mat, typename Vec>
void train (vector<Mat*>& Generators,
const vector<Vec*>& X,
Vec* root_node, // This is assuming that the root node is in X
int n,
int q)
{
// Create a schreier tree out of the generating set and the input set
tuple<std::unordered_map<int, tuple<int, Mat*>>, size_t>
tree_info_ = FiniteField::ComputeSchreierTree(Generators, X, root_node, n, q);
std::unordered_map<int, tuple<int, Mat*>> tree_ = std::get<0>(tree_info_);
make_move(1, 1280, tree_, Generators, n, q);
}
Где Mat
равно Matrix<T>
, а Vec
равно Vector<T>
.Приведенная выше функция принимает эти параметры и генерирует std::unordered_map<_key, _Tp, _Hash, _Pred, _Alloc>
, называемый tree_
, где ключом является int
, а значением является std::tuple<_Elements ...>
из int
и Mat*
.
Теперь то, что я хочучтобы сделать это, передайте эти tree_
и Generators
другой функции с именем make_move(...)
, определенной ниже:
template <typename Mat,
typename I,
typename... Args,
template <typename, typename, typename...> class Tup,
template <typename, typename, typename...> class Tree,
template <typename, typename...> class X>
void make_move(I i, I j,
Tree<I, Tup<I, Mat*, Args...>, Args...>& tree_,
X<Mat*, Args...>& Generators, int n, int q) {
// Make a direct edge between node i and node j
// by first tracing the path from node j to
// node i, multiplying all the edge labels along
// the way and then taking the inverse.
// // Note: node j is in a deeper level of the tree than node i
Mat M(n, n);
M.identity();
while (std::get<0>(tree_[j]) != std::get<0>(tree_[i])) {
FiniteField::dot(M, *std::get<1>(tree_[j]), M, q);
j = std::get<0>(tree_[j]);
}
M.print();
}
Проблема здесь в том, что когда я пытаюсь скомпилировать ее, я получаю следующую ошибку:
error: no instance of function template "make_move" matches the argument list
argument types are: (int, int, std::unordered_map<int, std::tuple<int, Matrix<unsigned int> *>, std::hash<int>, std::equal_to<int>, std::allocator<std::pair<const int, std::tuple<int, Matrix<unsigned int> *>>>>, std::vector<Matrix<unsigned int> *, std::allocator<Matrix<unsigned int> *>>, int, int)
Это мой первый опыт передачи нескольких вложенных шаблонных классов в шаблонные функции, поэтому я не знаю правильных комбинаций ключевых слов для поиска в Google, поэтому я не смог уйти далекоэто, поэтому любая помощь будет оценена.
Спасибо!