Нет подходящего конструктора для инициализации шаблона variadi c в C ++ - PullRequest
1 голос
/ 25 февраля 2020

Пытаясь выучить Variadic templates и понятия не имею, почему это не скомпилируется, ошибка: no matching constructor for initialization of 'test<>'.

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

template <typename ...Args>     // this is just how Variadic template are defined
class test {
 public:
 int arr[sizeof...(Args)];       // this is packing or unpacking? why are 
                                 // dots outside of bracket?

 test(Args... arg)               // this is called packing?
               : arr{arg...}{}   // this is called un-packing?
};

int main(){
 test<> t(1,2,3);
 return 0;
}

Редактировать: кажется, что мне нужно сделать test <int, int, int>, но почему я должен это делать, так как этот другой пример работает так:

template <typename ...Args> 
int func(Args... arg)
{
   int a[] = {arg...};
   return sizeof...(arg);
}

int main(void)
{
    std::cout << func(1,2,3,4,5,6) << std::endl;
    return 0;
}

fun c не нужна <int, int ,int.. часть.

1 Ответ

2 голосов
/ 25 февраля 2020

Ваш первый пример не работает, потому что вам нужно указать такие типы, как:

int main() {
    test<int, int, int> t(1,2,3);
    return 0;
}

Если вы можете использовать C ++ 17, вы можете воспользоваться выводом аргумента шаблона класса и имеют что-то вроде:

int main() {
   test t(1,2,3);
   return 0;
}

Но до C ++ 17 вычитание аргумента шаблона класса не существовало . Однако вычет аргумента шаблона функции существовал. Вот почему ваш второй пример работает без явного указания типов шаблонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...