gpt4 book ai didi

c++ - Variadic 模板行为怪异

转载 作者:行者123 更新时间:2023-11-30 03:05:15 31 4
gpt4 key购买 nike

我想知道是我做错了什么还是编译器错误。我正在使用 Intel C++ Composer XE 2011 for Windows 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;
//..
}

请注意,您缺少 参数的基本情况。我可能会取消部分特化并仅将主模板声明为:

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

然后,当你说 first_va_arg<>::type ,您不会收到“不存在的名称”错误,而是可能更有意义的“模板参数不匹配”。由你决定。或者,您可以只声明主模板,但不定义它。

关于c++ - Variadic 模板行为怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7869493/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com