2013-06-26 41 views
2

使用GCC 4.7.3,我得到以下錯誤爲什麼這個可變參數模板專門化定義不能編譯?

prog.cpp: In function ‘int main()’: prog.cpp:27:63: error: ‘Erase >::Result’ has not been declared

this code

template <typename... List> 
struct TypeList 
{ 
    enum 
    { 
     Length = sizeof...(List) 
    }; 
}; 

template <typename ToErase, typename... List> 
struct Erase; 

template <typename ToErase> 
struct Erase<ToErase, TypeList<>> 
{ 
    typedef TypeList<> Result; 
}; 

template <typename ToErase, typename... Head, typename... Tail> 
struct Erase<ToErase, TypeList<Head..., ToErase, Tail...>> 
{ 
    typedef TypeList<Head..., Tail...> Result; 
}; 

int main() 
{ 
    static_assert(Erase<double, TypeList<int, double, char>>::Result::Length == 2, 
    "Did not erase double from TypeList<int, double, char>"); 

    return 0; 
} 

我不明白爲什麼代碼不會編譯給我收到錯誤消息,因爲一個類似的情況下編譯乾淨:

​​

是否有一個標準關於不能推斷元素在tw中o參數包,就像我想要做的第一塊代碼?

回答

3

§ 14.8.2.5(從類型中推導模板參數)第5段列出了無法推導出模板參數的上下文。有關的一個是最後一個在列表中:

— A function parameter pack that does not occur at the end of the parameter-declaration-clause.

所以:

struct Erase<ToErase, TypeList<Head..., ToErase, Tail...>> 

Head不能推導出;它不會出現在參數列表的末尾。

相反,在:

struct Append<TypeList<ToAppend...>, TypeList<List...>> 

兩個ToAppendList出現在它們各自的參數列表的末端,並因此它們可以被推斷出來。

相關問題