簡體   English   中英

在VS2010中解析/實例化模板有問題嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM