1 / 1 / 0
Регистрация: 24.08.2016
Сообщений: 14
1

Expansion pattern contains no argument packs

24.08.2016, 13:03. Показов 3592. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть 3 функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void add(short n) {
  //...
  return;
}
void add(short a, short n) {
  //...
  add(n...);
  return;
}
int main(void) {
  add(1, 2, 4);
}
При компиляции ошибка: error: expansion pattern 'n' contains no argument packs
add(n...);
^
Если сделать так:
C++
1
2
3
4
5
6
7
8
template< typename... Targs> void add(short a) {
  //...
  return;
}
template< typename... Targs> void add(short a, Targs... n) {
  //...
  add(n...);
  return;
Все работает. Почему?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.08.2016, 13:03
Ответы с готовыми решениями:

PINBOARD II и Software packs из Keil 5
Мне не дает покоя вопрос - почему никак не удается поженить сконфигурированный через software pack...

Expansion Files
Привет! Создал приложение с большой базой данных, около 300 мегабайт. Но Google Play поддерживает...

Не находит expansion file
Здравствуйте! В приложении есть большое количество картинок и аудио. На этапе публикации приложения...

Файл расширения (Expansion File)
Есть приложение, где используется Expansion File. При загрузке приложения файл скачивается в папку...

11
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
24.08.2016, 13:09 2
Цитата Сообщение от SomeDay Посмотреть сообщение
Почему?
Странный вопрос.
Потому что в первом случае n не является argument pack. Это обычный параметр.
0
1 / 1 / 0
Регистрация: 24.08.2016
Сообщений: 14
24.08.2016, 13:21  [ТС] 3
ошибся, не дописал троеточие:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void add(short n) {
  //...
  return;
}
void add(short a, short... n) {
  //...
  add(n...);
  return;
}
int main(void) {
  add(1, 2, 4);
}
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
24.08.2016, 13:38 4
SomeDay,
Когда шаблон
C++
1
template< typename... Targs> void add(short a, Targs... n)
из первого поста инстанцируется, то возникает две функции: одна с тремя параметрами, другая с двумя. Без шаблона у тебя одна функция и она не может размножится
А все потому, что шаблон функции - это не функция, а только заготовка для нее.
Отюда все ограничения на применение argument pack.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.08.2016, 13:50 5
http://rextester.com/VTC78791

C++
1
2
3
4
5
6
7
8
9
10
11
12
void add(short n) {
  //...
  return;
}
void add(short a, auto&& ... n) {
  //...
  add(n...);   //<---- there must be the std::forward
  return;
}
int main(void) {
  add(1, 2, 4);
}
0
1 / 1 / 0
Регистрация: 24.08.2016
Сообщений: 14
24.08.2016, 14:06  [ТС] 6
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
из первого поста инстанцируется, то возникает две функции: одна с тремя параметрами, другая с двумя. Без шаблона у тебя одна функция и она не может размножится
Как я понял, это значит, что у кажго аргумента уникальный тип?
hoggy,
auto&& - это двойная ссылка?
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
24.08.2016, 14:10 7
Цитата Сообщение от SomeDay Посмотреть сообщение
Как я понял, это значит, что у кажго аргумента уникальный тип?
Да, но он может совпадать.
И можно, если нужно, задать жесткое ограничение, чтобы он совпадал.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.08.2016, 14:11 8
Цитата Сообщение от SomeDay Посмотреть сообщение
auto&& - это двойная ссылка?
https://habrahabr.ru/post/242639/
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
24.08.2016, 14:12 9
Цитата Сообщение от SomeDay Посмотреть сообщение
это двойная ссылка?
Это rvalue ссылка. Она, в общем-то, к теме отношения не имеет.
По сути вариант с auto - это тоже шаблон, только неявный. Т.е. выводы все те же самые.
0
1 / 1 / 0
Регистрация: 24.08.2016
Сообщений: 14
24.08.2016, 14:14  [ТС] 10
DrOffset,
Если не сложно, можно простой пример?

Добавлено через 1 минуту
hoggy,
Благодарю за ответ
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
24.08.2016, 14:23 11
Цитата Сообщение от SomeDay Посмотреть сообщение
Если не сложно, можно простой пример?
Пример простой, но требует подготовки для понимания
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <typename ...T>
struct pack { };
 
template <typename T, typename ...Other>
struct check_same
    : std::is_same<pack<T, Other...>, pack<Other..., T>>
{ };
 
 
void add(int n)
{
  //...
}
 
template <typename ...T>
typename std::enable_if<
    check_same<int, T...>::value // говорим, что все типы в T... должны быть int
>::type add(int a, T ...n)
{
    //...
    add(n...);
}
0
1 / 1 / 0
Регистрация: 24.08.2016
Сообщений: 14
24.08.2016, 14:25  [ТС] 12
DrOffset,
Большое спасибо!
Тема исчерпана.
0
24.08.2016, 14:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2016, 14:25
Помогаю со студенческими работами здесь

Seagate Expansion Drive не распознаётся
Всем доброго дня. Имеется диск Seagate Expansion Drive 1TB Model: SRD00F2. Аппарат стабильно...

Expansion expected but found begin
Cкрин ошибки. http://pic2net.ru/7120335931

Долго ли осталось жить Seagate Expansion?
Вот результат теста CristaliskInfo. Что порекоммендуете делать в данной ситуации?

AVR Assembler. Метки и macro expansion
Пытаюсь написать ряд макросов для работы с циклическими буферами и запнулся об macro expansion. При...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru