【发布时间】:2018-06-08 01:09:05
【问题描述】:
我想专门研究getVector 成员函数,我正在尝试为此使用 SFINAE。但它仅在 Dim 为 3 或更大时才有效。
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 实例化点)
-
有些东西你没有给我们看。如果不使用模板类的成员函数,则不会实例化它们。你能告诉我们调用站点吗?
-
@papagaga 这并不完全正确,成员函数声明(但不是它们的定义)在类模板时被实例化。因此,如果声明包含一个表达式,该表达式仅在类模板参数上,并且该表达式结果格式错误,即使该函数未“使用”也会引发错误...
-
它们都编译得很好。 ideone.com/g4rRMu
-
@MassimilianoJanes:在这种情况下,
getVectorBegin不仅仅依赖于类模板参数,是吗?但感谢您的精确。 / @嗨,我是 Frogatto:那是因为在调用getVectorBegin的构造函数中有一些东西,我们在 sn-p 中看不到。
标签: c++ class templates template-specialization sfinae