嵌套的可变模板:gcc或clang中的错误

Nested variadic templates: bug in gcc or clang?

本文关键字:clang 错误 gcc 嵌套      更新时间:2023-10-16

以下代码不使用gcc 4.7(20120114)编译,但使用clang++3.0可以很好地编译。这是gcc、clang中的一个错误,还是仅仅因为我试图做的事情在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;
}

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

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

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

演示:http://ideone.com/MFKVY

相关文章: