C++ 嵌套变量模板:gcc中的错误还是叮当声?

C++ 嵌套变量模板:gcc中的错误还是叮当声?,c++,c++11,variadic-templates,C++,C++11,Variadic Templates,以下代码不使用GCC4.7(20120114)编译,但可以使用clang++3.0编译。这是gcc中的一个bug,还是仅仅因为c++11中不允许我尝试做的事情 template< typename... args > struct A { template< typename head, typename... tags > struct Inner : public Inner<tags...> { }; template&

以下代码不使用GCC4.7(20120114)编译,但可以使用clang++3.0编译。这是gcc中的一个bug,还是仅仅因为c++11中不允许我尝试做的事情

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;
}
模板
结构A{
模板
结构内部:公共内部{
};
模板
结构内部{
//假设参数…和标记…都必须用于
//计算类型
typedef int类型;
};
};
模板<类型名。。。args>
结构B:A{
模板
typename A::模板内部::类型x(){
返回0;
}
};
int main(int argc,const char*argv[]{
B B;
b、 x();
返回0;
}

上面的代码是我尝试做的一个非常简单的示例,但本质是我需要两个参数。。。类型和标记。。。类型来计算函数的返回类型。如何做到这一点?

不确定这是否是gcc的错误,但让它在gcc上编译的标准解决方案是声明空的变量版本,然后专门化它:

template <typename... T> 
struct Inner;
template <typename Head, typename... Rest>
struct Inner<Head, Rest...> : public Inner<Rest...> { ... };
模板
结构内部;
模板
结构内部:公共内部{…};
演示: