template <int I, typename T> struct Wrap {
T internal;
};
template <int I, typename T>
Wrap<I, T> DoStuff(int z) { return Wrap<I, T>{(T)z}; }
class Wrapped {
public:
// Working
Wrap<1, int> GetInt() { return DoStuff<1, int>(1); }
Wrap<2, long> GetLong() { return DoStuff<2, long>(2); }
// Not working
Wrap<3, char> GetChar() { return DoStuff(3); }
};
在線嘗試
為什么第三個函式無法決議模板引數?我認為編譯器會嘗試將模板定義與函式的回傳型別相匹配。這適用于 c 14 還是任何更新版本?
uj5u.com熱心網友回復:
扣除不使用回傳值... “除外”用于轉換運算子。
因此,您可以創建一個轉換為 any 的類Wrap<I, T>:
struct ToWrap
{
int n;
template <int I, typename T>
operator Wrap<I, T>() const { return Wrap<I, T>{T(n)}; }
};
ToWrap DoStuff(int z) {
return ToWrap{z};
}
演示
uj5u.com熱心網友回復:
您將回傳型別指定為的事實Wrap<3, char>并不意味著您不能Wrap在內部創建其他引數化型別的物件GetChar()。您需要指定模板引數,因為DoStuff(3)這只是一個不決議Ior的函式呼叫T。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/513360.html
標籤:C c 11模板
