我试图编写一个代码(截至2014年1月使用mingw32 gcc4.8.1),其中包含两个参数包Args1...
和Args2...
。我在这里学到了(http://en.cppreference.com/w/cpp/language/parameter_pack)我需要一个嵌套类。 Args1...
和Args2...
的长度相同(最终我希望从Args2...
中推断出Args1...
。有时它们甚至可以是同一类型。所以我想为这个简单的案例写一个简写using
语句作为开头:
template <typename R, typename ...Args>
using zip_t = zip<R, Args...>::with<Args...>;
但是,gcc在编译此语句时会生成段错误。任何人都可以解释我是否做错了什么或这是一个gcc bug?
g++ -std=c++11 -I.. testUsing.cpp
testUsing.cpp: In substitution of 'template<class R, class ... Args> using zip_t = zip<R, Args1 ...>::with<Args ...> [with R = A; Args = {}]':
testUsing.cpp:19:15: required from here
testUsing.cpp:16:45: internal compiler error: Segmentation fault
using zip_t = zip<R, Args...>::with<Args...>;
^
最小代码如下:(改编自http://en.cppreference.com/w/cpp/language/parameter_pack)
template<typename...> struct Tuple {};
template<typename T1, typename T2> struct Pair {};
template<class R,class ...Args1> struct zip {
template<class ...Args2> struct with {
R flag;
typedef Tuple<Pair<Args1, Args2>...> type;
//Pair<Args1, Args2>... is the pack expansion, Pair<Args1, Args2> is the pattern
};
};
typedef zip<bool,short, int>::with<unsigned short, unsigned>::type T1;
T1 make_zip1(bool) {return T1();}
template <typename R, typename ...Args>
using zip_t = zip<R, Args...>::with<Args...>;
template<typename A>
static zip_t<A>::type make_zip(A) {
return zip_t<A>::type{};
}
//test code
int main() { return 0; }
答案 0 :(得分:1)
这肯定是一个g ++错误。但是你的代码不正确。
template <typename R, typename ...Args>
//using zip_t = zip<R, Args...>::with<Args...>;
using zip_t = typename zip<R, Args...>::template with<Args...>;
问题在于,您错过了两个关键字,一个类型名称和一个模板。
如果添加模板或typename但错过了另一个,gcc将不会核心段故障。 Clang会比gcc更好,它会告诉你你错过了typename关键字或模板关键字。
然而,如果你错过了两者,gcc将会出现故障,而clang会告诉你一个错过了你的错误名字的错误,但它不会告诉你你错过了模板。