我想專精getVector
成員函數,我正在嘗試使用SFINAE。但它只有在Dim爲3或更大時纔有效。SFINAE模板成員超載
template <size_t Dim>
class Mat
{
...
template <size_t VDim, typename enable_if<(Dim > 1 && VDim == 0)>::type* = nullptr>
void getVectorBegin(const array<size_t, Dim - 1>& indexAfter) const;
template <size_t VDim, typename enable_if<(Dim > 2 && 0 < VDim && VDim < Dim-1)>::type* = nullptr>
void getVectorBegin(const array<size_t, VDim>& indexBefore, const array<size_t, Dim - VDim - 1>& indexAfter) const;
template <size_t VDim, typename enable_if<(Dim > 1 && VDim == Dim-1)>::type* = nullptr>
void getVectorBegin(const array<size_t, Dim - 1>& indexBefore) const;
};
Mat<3> m;
Mat<2> m; // error C2039: 'type': is not a member of 'std::enable_if<false,_Ty>'
您是否嘗試將「Dim> x」檢查作爲最後的&&術語?我不確定編譯器是否正確,或者它只是實現定義的,但它可能會縮短enable_if條件,並認爲它的值不依賴於VDim,因此在成員聲明實例化期間發生編譯器錯誤(即,在Mat <2>瞬間點) –
有些東西你沒有向我們展示。如果不使用模板類的成員函數,則不會實例化。你能告訴我們呼叫網站嗎? – papagaga
@papagaga這不完全正確,成員函數聲明(但不是它們的定義)在類模板時被實例化。因此,如果聲明在類模板參數中包含一個僅依賴於值的表達式,並且表達式結果不正確,那麼即使該函數未被「使用」也會產生錯誤... –