1
私は何か間違っているのか、これがコンパイラのバグなのかなと思います。私は、インテル®C++ Composer XE 2011 for 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についてすべて忘れてしまった。しかし今回はtypedefのために必要でした。しかし、関数の戻り値の型としてtypenameを追加する必要はありません(少なくともこのコンパイラでは)。 – zeroes00
さて、C + +言語について話しているなら、それを追加する必要があります。私たちがあなたのコンパイラとその拡張と仕様について話しているなら、私はそれに精通していないので、わかりません。 –
私は、typenameに関するリラックスしたルールがC++ 11と一緒に来たと思っていましたが、間違いかもしれません。 – zeroes00