可变模板行为怪异
Variadic template acting weird
我想知道我是否做错了什么,或者这是一个编译器错误。我使用的是Intel c++ Composer XE 2011 for Windows with SP1(或更新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;
}
由于您有依赖的名称,因此您需要说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
时,您不会得到"不存在的名称"错误,而是可能更有意义的"模板参数不匹配"。由你决定。或者,你可以只声明为主模板,但不定义它。
相关文章:
- 没有找到相关文章