以下代码不能使用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 ... types和tags ...类型来计算函数的返回类型。怎么办呢?
答案 0 :(得分:3)
不确定它是否是gcc的错误,但是使其在gcc上编译的标准解决方案是声明空的可变参数版本然后专门化它:
template <typename... T>
struct Inner;
template <typename Head, typename... Rest>
struct Inner<Head, Rest...> : public Inner<Rest...> { ... };