2011-10-23 4 views
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; 
} 

答えて

3

あなたは依存名を持っているので、あなたは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を言うとき、あなたは「非既存の名前」のエラーを得ることはありませんが、潜在的に、より意味のあります"テンプレートパラメータの不一致"。あなた次第。あるいは、は、プライマリテンプレートを宣言するだけですが、定義されていません。

+0

ありがとうございました。私は、インテルのコンパイラがそれらの要件をかなり緩和しているので、typenameについてすべて忘れてしまった。しかし今回はtypedefのために必要でした。しかし、関数の戻り値の型としてtypenameを追加する必要はありません(少なくともこのコンパイラでは)。 – zeroes00

+0

さて、C + +言語について話しているなら、それを追加する必要があります。私たちがあなたのコンパイラとその拡張と仕様について話しているなら、私はそれに精通していないので、わかりません。 –

+0

私は、typenameに関するリラックスしたルールがC++ 11と一緒に来たと思っていましたが、間違いかもしれません。 – zeroes00

関連する問題