我今天的問題很簡單:為什么編譯器無法像從函數參數中那樣從類構造函數中推斷模板參數?例如,為什么以下代碼無效:template<typename obj>class Variable { obj data; public: Variable(obj d) { data = d; }};int main(){ int num = 2; Variable var(num); //would be equivalent to Variable<int> var(num), return 0; //but actually a compile error}正如我所說,我知道這是無效的,所以我的問題是為什么呢?允許這樣做會造成任何重大的語法漏洞嗎?是否存在一個實例,該實例不希望使用此功能(推斷類型會導致問題)?我只是想了解允許對函數進行模板推斷的邏輯,而對于適當構造的類則不是。
3 回答

阿波羅的戰車
TA貢獻1862條經驗 獲得超6個贊
由于其他人已解決的原因,您無法執行所要求的操作,但是您可以執行以下操作:
template<typename T>
class Variable {
public: Variable(T d) {}
};
template<typename T>
Variable<T> make_variable(T instance) {
return Variable<T>(instance);
}
出于所有目的和目的,這都是您要的。如果您喜歡封裝,可以將make_variable設為靜態成員函數。這就是人們所說的命名構造函數。因此,它不僅可以滿足您的要求,而且幾乎可以滿足您的要求:編譯器從(命名的)構造函數中推斷出模板參數。
注意:任何合理的編譯器在編寫類似以下內容時都會優化掉臨時對象
Variable<T> v = make_variable(instance);
- 3 回答
- 0 關注
- 444 瀏覽
添加回答
舉報
0/150
提交
取消