2016-06-17 71 views
1

因爲人們不會以類似grep的方式閱讀和比較代碼,所以我立即指出這不是Template argument for non-type parameter must be an expression的重複,而是我在閱讀後想到的另一個代碼。因此,請將它作爲一個整體閱讀,不要只看類名。爲什麼模板不能通過模板參數「超載」?

template <typename T, int N> 
struct Vector { 
    T data[N]; 
}; 

struct Dynamic { 
}; 

template <typename T, Dynamic> 
struct Vector { 
    T* data; 
}; 

我想要兩個模板:一個接收編譯時整數,另一個接收用作標記的類型。

雖然無論因爲什麼原因,第二個模板將被解釋爲第一個模板的專業化(或重新定義?),但這不會起作用。

爲什麼無法通過模板參數對模板進行消歧?任何邏輯/編譯原因呢?

+0

你可以繼續問,但你不會得到你想要的答案:-S語言不會讓你這樣做。 –

+0

呃我只是好奇,對不起,如果這看起來像一個轉發。我只是不明白爲什麼模板重載(使用不同的參數類型,例如類型和非類型)將是一個壞主意 – Dean

+0

毫無疑問,但這不是一個思考好主意的網站。 –

回答

4

就你的問題而言,答案是:「因爲」。並非每一個功能都是該語言的一部分。你可以嘗試模板專業化(儘管我個人以前沒有在非類型參數中使用過它,但我看到了它爲什麼不起作用的原因)。

template <typename T, int N> 
struct Vector 
{ 
    T data[N]; 
}; 

const int Dynamic = INT_MAX; 

template <typename T> 
struct Vector<T, Dynamic> 
{ 
    T* data; 
}; 
+0

是的,這工作,但我不明白爲什麼我不能有兩個模板,一個接受'typename,int'和一個簽名'typename,typename'。這些是相當區別 – Dean

+2

我想這只是不夠明確,它沒有成爲優先執行。花費大量時間使用C++經常會成爲尋找替代方法的嘗試,以嘗試模擬您真正想要做的事情。 – Mitch

4

因爲這不是語言的工作原理;就這麼簡單!

模板定義一次,然後可以選擇專門化以後。他們沒有「超載」語義。

+0

有沒有這樣的建議?我不明白爲什麼它不會有好處。 – Dean

+2

@Dean:我不明白爲什麼會這樣。隨意編寫並提交這樣一個提案,但不要指望它去任何地方。 –

相關問題