可能重复:
How to use enable_if to enable member functions based on template parameter of class
我有一个课程模板:
template<typename T, size_t N> class Vector
我想为特定的N
启用构造函数,所以我这样做:
Vector(typename boost::enable_if_c<N==2, T>::type const &e0, T const &e1) {
data[0] = e0;
data[1] = e1;
}
但编译器(MSVC 2010 SP1)给出了错误,而不是应用SFINAE。错误是:
error C2039: 'type' : is not a member of 'boost::enable_if_c<B,T>'
with
[
B=false,
T=float
]
有什么问题?这是一个已知的问题吗?我该如何解决?它是使用static_assert
的唯一解决方案吗?
编辑: GCC也没有成功:http://ideone.com/7Ejo8
答案 0 :(得分:5)
您不能使用enable_if
根据类的模板参数允许/禁止成员函数:enable_if
只能应用于函数或类模板。
在您的情况下,我能想到的唯一解决方案是使用enable_if
或更简单地使用部分特化来专门化整个班级。您可以将公共成员放在公共基类中,以避免重复它们:
#include <cstdio>
template<typename T, std::size_t N>
struct VectorCommon
{
std::size_t size() { return N; }
void add(T const & element) { }
};
template <typename T, std::size_t N>
struct Vector : VectorCommon<T, N>
{
};
template <typename T>
struct Vector<T, 2> : VectorCommon<T, 2>
{
Vector(T const & e0, T const & e1) {}
};
int main()
{
//Vector<int, 100> v100(12, 42); // compile error
Vector<char, 2> v2('a', 'b'); // ok
}