1 回答

TA貢獻(xiàn)1877條經(jīng)驗 獲得超6個贊
這是不可能的。該標(biāo)準(zhǔn)對此也有注釋14.8.1/7
[注意:因為顯式模板參數(shù)列表緊隨功能模板名稱,并且由于在不使用函數(shù)名稱的情況下調(diào)用轉(zhuǎn)換成員函數(shù)模板和構(gòu)造函數(shù)成員函數(shù)模板,所以無法為這些功能模板提供顯式模板參數(shù)列表。]
說明:這說:模板參數(shù)在函數(shù)模板名稱(例如)之后的尖括號中傳遞std::make_pair<int, bool>。構(gòu)造函數(shù)沒有自己的名稱,但是會在各種上下文中濫用其類名稱(因此,U<int>()意味著:傳遞<int>給類模板U,并通過調(diào)用不帶參數(shù)的默認(rèn)構(gòu)造函數(shù)來構(gòu)造對象)。因此,不能將模板參數(shù)傳遞給構(gòu)造函數(shù)。
在您的情況下,您嘗試在成員初始化程序中傳遞模板參數(shù)。在這種情況下,還有更多的問題:它將嘗試將其解析和解釋t<void>為基類類型,并認(rèn)為您想調(diào)用基類的默認(rèn)構(gòu)造函數(shù)。當(dāng)然,這將失敗。
如果可以忍受,可以解決它
struct T {
template<class U> T(identity<U>);
};
struct U {
U() : t(identity<void>()) {}
T t;
};
由于identity喜歡它的升壓轉(zhuǎn)換器的定義
template<typename T> struct identity { typedef T type; };
- 1 回答
- 0 關(guān)注
- 278 瀏覽
添加回答
舉報