我正在嘗試使用可變參數模板,並得到一個奇怪的問題,我不明白爲什麼會引發錯誤消息。嵌套類中的可變參數模板
template<int v0, int ...Vs>
class Foo
{
public:
template<typename nested = void,
typename = void>
class Reduce
{
public:
static int const value = v0;
};
template<typename nested>
class Reduce<nested,
typename std::enable_if<0<sizeof...(Vs)>::type>
{
public:
static int const value = v0 + Foo<Vs...>::template Reduce<>::value;
};
};
本準則所帶來的錯誤信息
//example code
int s = Foo<0,1,2,3,4,5>::Reduce<>::value;
std::cout << s << std::endl;
error: incomplete type 'F<5>::Reduce<>' used in nested name specifier
我插入嵌套虛擬模板參數,因爲在模板嵌套類模板類不能完全專業化。其實我不明白爲什麼編譯器會抱怨一個不完整的類型。
當我改變一個可變的東西
template<int v0, int ...Vs>
class Reduced
{
public:
static int const value = v0 + Reduce<Vs...>::value;
};
template<int v0>
class Reduced<v0>
{
public:
static int const value = v0;
};
template<int v0, int ...Vs>
class Foo
{
public:
class Reduce
{
public:
static int const value = Reduced<v0, Vs...>::value;
};
};
它工作的,但我不知道爲什麼,另一個沒有。任何想法爲什麼編譯器會拋出這個錯誤?感謝幫助。
用這種方法我根本不需要模板參數'嵌套',對吧?此外,我喜歡避免Foo類的專業化。因爲在實際使用情況中,它包含更多其他我不想爲專業化實現的東西。 – Feuerteufel
@Feuerteufel是的,模板參數對於這種方法是多餘的。 – 101010
@Feuerteufel我添加了一個編輯檢查,如果它適合你。 – 101010