2012-01-21 10 views
1

次のコードはgcc 4.7(20120114)でコンパイルされませんが、clang ++ 3.0でうまくコンパイルされます。これはgcc、clangのバグですか、それとも私がやろうとしていることはC++ 11では許可されていないからですか?の戻り値の型を計算するネストされた可変テンプレート:gccまたはclangのバグ?

template< typename... args > 
struct A { 
    template< typename head, typename... tags > 
    struct Inner : public Inner<tags...> { 
    }; 

    template< typename head > 
    struct Inner<head> { 
     // assume both args... and tags... must be used to 
     // calculate TYPE 
     typedef int TYPE; 
    }; 
}; 

template< typename... args > 
struct B : A<args...> { 
    template<typename... tags> 
    typename A<args...>::template Inner<tags...>::TYPE x() { 
     return 0; 
    } 
}; 

int main(int argc, const char *argv[]) { 
    B<int, int, int> b; 
    b.x<char, short, long, double>(); 

    return 0; 
} 

上記のコードは、私がやろうものの非常に単純化した例であるが、本質は、私は引数...種類とタグの両方を必要とするということです...種類関数。これはどうすればできますか?

答えて

3

ない、それはgccののバグですか、それは、GCCでコンパイルさせるための標準的な解決策は、空の可変引数バージョンを宣言し、それを専門とする場合を確認します。

template <typename... T> 
struct Inner; 
template <typename Head, typename... Rest> 
struct Inner<Head, Rest...> : public Inner<Rest...> { ... }; 

デモ:http://ideone.com/MFKVY

関連する問題