передать несколько вложенных шаблонных классов в шаблонные функции - PullRequest
0 голосов
/ 30 ноября 2018

Я занимаюсь этим часами, но не могу найти способ решить эту проблему.Прежде чем спросить, это не домашний вопрос.

Итак, у меня есть два настраиваемых шаблонных класса с именами 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, поэтому я не смог уйти далекоэто, поэтому любая помощь будет оценена.

Спасибо!

1 Ответ

0 голосов
/ 30 ноября 2018

In

template <typename Mat, typename Vec>
void make_move(int i, int j,
               unordered_map<int, tuple<int, Mat*>>& tree_,
               vector<Mat*>& Generators, int n, int q);

Vec не может быть выведено (это не указано в аргументах), поэтому вы должны указать его при вызове:

make_move<Mat, Vec>(1, 1280, tree_, Generators, n, q);

Но, вероятно, естьопечатка:

  • Должно ли vector<Mat*> быть Vec вместо?
  • Должно ли make_move иметь Vec аргумент шаблона?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...