Variadic шаблон действует странно - PullRequest
1 голос
/ 24 октября 2011

Интересно, я что-то не так делаю или это ошибка компилятора?Я использую Intel C ++ Composer XE 2011 для Windows с пакетом обновления 1 (или обновление 6, которое в настоящее время является последним).Смотрите закомментированные строки в коде.

#include <tchar.h>
#include <iostream>
#include <conio.h>

template <typename ...T>
struct first_va_arg {};

template <typename T0, typename ...T_>
struct first_va_arg<T0, T_...> {
    typedef T0    type;
};

template <typename ...T>
inline first_va_arg<T...>::type getFirstArgTypeDefaultValue( const T& ...values )
{
//Next line causes error: nontype "first_va_arg<T...>::type [with T=<T...>]" is not a type name
    typedef first_va_arg<T...>::type    FirstArgT;
    return FirstArgT();
//It works correctly if you comment out the above two lines and uncomment the single line below
    //return first_va_arg<T...>::type();
}


int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << getFirstArgTypeDefaultValue(5.67, 32) << std::endl;
    _getch();
    return 0;
}  

1 Ответ

3 голосов
/ 24 октября 2011

Поскольку у вас есть зависимое имя , вам нужно сказать typename:

template <typename ...T> inline typename first_va_arg<T...>::type getFirstArgTypeDefaultValue( const T& ...values )
//                              ^^^^^^^^
{
  typedef typename first_va_arg<T...>::type FirstArgT;
  //..
}

Обратите внимание, что вам не хватает базового варианта для параметров no . Я бы, вероятно, покончил с частичной специализацией и просто объявил бы основной шаблон как:

template <typename T, typename...> struct first_va_arg  { typedef T type; };

Затем, когда вы говорите first_va_arg<>::type, вы не получаете ошибку «несуществующего имени», а потенциально более значимое «несоответствие параметров шаблона». Вам решать. В качестве альтернативы вы можете только объявить основной шаблон, но оставить его неопределенным.

...