Пожалуйста, помогите мне понять эту ошибку компилятора «расширение пакета не содержит нерасширенных пакетов параметров»

      template<typename ...>
bool foo(std::tuple<std::string,float> bar...)
{
    std::vector<std::tuple<std::string,float>> barList(bar...);

    // ...
}

Похоже, это не вызывает синтаксической ошибки. В этой строке редактора нет индикатора ошибки, но компилятор останавливается с

[Ошибка bcc32c] Foo.cpp(117): расширение пакета не содержит нерасширенных пакетов параметров

Я пытался читать онлайн, но все примеры, которые я нахожу, либо кажутся неполными, либо мне непонятны.

Приветствуется простой ответ на вопрос, почему это не компилируется.

1 ответ

Решение

Ваш синтаксис неверен. Ваша функция эквивалентна:

      bool foo(int bar...)
{
    std::vector<int> barList(bar...);

    // ...
}

Обратите внимание, что здесь вообще нет вариативных шаблонов и нечего распаковывать - вместо этого вы создали вариативную функцию в стиле C.

Самый простой способ изменить вашу функцию:

      template<typename... Args>
bool foo(Args... bar)
{
    std::vector<std::tuple<std::string,float>> barList({bar...});

    // ...
}

Это не идеально, поскольку делает вашу функцию-шаблон довольно жадной - она ​​с радостью принимает любые аргументы, а не только кортежи строк и чисел с плавающей запятой.

Мы можем оживить его, используя C++20 concepts:

      template<class T>
concept Tuple = std::is_same_v<T, std::tuple<std::string, float>>;

template<Tuple... T>
bool foo(T... bar)
{
    std::vector<std::tuple<std::string, float>> barList({bar...});

    // ...
    return true;
}

Это позволяет использовать следующее:

      foo(std::tuple<std::string, float>{"ddd", 20}, std::tuple<std::string, float>{"ddd", 20});

Но не так:

      foo(10, 20, nullptr);
Другие вопросы по тегам