Почему я не могу передать числовой параметр шаблона в свою шаблонную функцию?

У меня есть собственный класс, инкапсулирующий ("MyTuple"), и другой класс, реализующий собственный интерфейс для ("MyInterface"). Мне нужен этот отдельный интерфейс в кодовой базе, код ниже упрощен.

Поскольку элементы std::tupleнеобходимо получить доступ с помощью ключа в качестве параметра шаблона, функции интерфейса имеют числовой параметр шаблона size_t Keyкоторый затем дается std::getдля кортежа, например.

Этот интерфейс работает нормально, но не при вызове его из другой шаблонной функции, которая передает числовой параметр как «ключ»:

      #include <iostream>
#include <functional>
#include <tuple>
#include <string>

template <typename... Types>
class MyInterface {
  public:
    MyInterface(const std::tuple<Types...>& tuple) : tuple(tuple) {}

    template <size_t Key>
    std::string getString() {
      return std::to_string(std::get<Key>(tuple));
    }
  private:
    const std::tuple<Types...>& tuple;
};

template <typename... Types>
class MyTuple {

  public:
    MyTuple(Types... values) : value(std::tuple<Types...>(values...)) {}

    template <size_t Key>
    std::string asString() {
      MyInterface<Types...> interface(value);
      return interface.getString<Key>(); // here I get the compiler error
    }

  private:
    std::tuple<Types...> value;
};

int main() {
  MyInterface<int, float, long> interface(std::tuple<int, float, long>(7, 3.3, 40));
  std::cout << interface.getString<0>() << std::endl; // this works fine

  MyTuple<int, float, long> tuple(7, 3.3, 40);
  std::cout << tuple.asString<0>() << std::endl;
}

Полный вывод g++:

      templated_function_parameter_pack.cpp: In member function ‘std::__cxx11::string MyTuple<Types>::asString()’:
templated_function_parameter_pack.cpp:28:39: error: expected primary-expression before ‘)’ token
       return interface.getString<Key>(); // here I get the compiler error
                                       ^
templated_function_parameter_pack.cpp: In instantiation of ‘std::__cxx11::string MyTuple<Types>::asString() [with long unsigned int Key = 0; Types = {int, float, long int}; std::__cxx11::string = std::__cxx11::basic_string<char>]’:
templated_function_parameter_pack.cpp:40:34:   required from here
templated_function_parameter_pack.cpp:28:33: error: invalid operands of types ‘<unresolved overloaded function type>’ and ‘long unsigned int’ to binary ‘operator<’
       return interface.getString<Key>(); // here I get the compiler error

Почему неверный синтаксис для вызова interface.getString<Key>()внутри MyTuple::asString<size_t Key>?

1 ответ

Когда вы хотите вызвать метод шаблона экземпляра, вам нужно написать это:

      return interface.template getString<Key>();

В этом ответе вы найдете все подробности о том, почему: где и почему я должен помещать ключевые слова «шаблон» и «имя типа»?

Другие вопросы по тегам