有人可以解釋爲什麼這些兩個專業沒有區別的編譯器(gcc 4.5.1 @ ideone)模板偏特
template <typename... T> struct S;
template<typename A, typename B, typename... C>
struct S<A, B, C...> {
int f() {return 1;}
};
template<typename... A, typename... C>
struct S< S<A...>, C...> {
int f() {return 2;}
};
,當我嘗試實例S<S<a, b>, a, b> o2;
編譯器抱怨:
prog.cpp:20:21: error: ambiguous class template instantiation for 'struct S<S<a, b>, a, b>'
prog.cpp:6:22: error: candidates are: struct S<A, B, C ...>
prog.cpp:11:33: error: struct S<S<A ...>, C ...>
prog.cpp:20:21: error: aggregate 'S<S<a, b>, a, b> o2' has incomplete type and cannot be defined
而當最後一個專業化改爲:
template<typename... A, typename B, typename... C>
struct S< S<A...>, B, C...> {
int f() {return 2;}
}
一切工作正常。
我想你也可以在這篇文章中添加代碼,因爲它對於這個問題非常重要。 – UncleBens
@UncleBens代碼已添加。 – Predrag