[英]Is it problem with parsing/instantiating templates in VS2010?
請不要介意此代碼的長度(只需復制和粘貼)。 當你這樣做運行它,它將無法在VS2010下編譯。 為了編譯這段代碼,在struct Range中從模板參數和main中刪除“class IntType”,而不是:
Range<int,float> r;
使
Range<float> r; //int is removed
碼:
template<class T>
struct Assign_Low_High
{
static const int low_value = 0;
};
//in order to compile remove class IntType, from template params of Range struct
template<class IntType, class L>
struct Range
{
static_assert(Assign_Low_High<L>::low_value < 1,
"Incorrect Range");
};
int main()
{
//in order to compile remove int from Range
Range<int,float> r;
return 0;
}
到底是怎么回事? (它確實與GCC 4.5.1一起編譯)。
好吧,看起來<運算符會使編譯器偏離錯誤的軌道。 如果你:
static_assert( Assign_Low_High<L>::low_value > -1, "Incorrect Range");
要么
static_assert( (Assign_Low_High<L>::low_value) < 1, "Incorrect Range");
它會工作。
如果你這樣做:
static_assert( Assign_Low_High<L>::low_value < 1 > 0, "Incorrect Range");
然后它變得有趣......
我認為編譯器應該將low_value依賴名稱視為非類型非模板依賴名稱,並將low_value后面的“<”視為小於運算符。 所以我會說gcc編譯器做正確的事情,而MS 2010編譯器沒有,但幸運的是它可以幫助產生所需的效果。
還有一件事,這顯然不是由於static_assert,因為:
bool bComp = Assign_Low_High<int>::low_value < 1;
直接在主要導致相同的編譯錯誤...
我現在無法編譯,但它看起來像你的static_assert失敗了。 當你實際上等於0時,你斷言低值小於0。
如果那不是問題,你介意發布編譯錯誤嗎?
編輯將靜態斷言移動到Range的構造函數正確編譯,並且在您使用模板時仍然可以實現斷言的目標。 基於此,以及斷言中的子句在不在斷言時編譯的事實,我會假設MS的static_assert實現有點錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.