【发布时间】:2016-05-17 15:32:01
【问题描述】:
我想写一个template class 用 SFINAE 检查一个特征。
正如我在那篇文章中所读到的那样,类不能“重载”:template overloading and SFINAE working only with functions but not classes
我写了以下代码:
class AA { public: using TRAIT = int; };
class BB { public: using TRAIT = float; };
template < typename T, typename UNUSED = void> class X;
template < typename T>
class X<T, typename std::enable_if< std::is_same< int, typename T::TRAIT>::value, int >::type>
{
public:
X() { std::cout << "First" << std::endl; }
};
template < typename T>
class X<T, typename std::enable_if< !std::is_same< int, typename T::TRAIT>::value, unsigned int >::type>
{
public:
X() { std::cout << "Second" << std::endl; }
};
int main()
{
X<AA> a;
X<BB> b;
}
但它只是失败了:
error: aggregate 'X<AA> a' has incomplete type and cannot be defined
X<AA> a;
^
error: aggregate 'X<BB> b' has incomplete type and cannot be defined
X<BB> b;
似乎没有一个模板可以工作,但我没有从编译器那里得到任何提示,为什么这两种专业化都失败了。
【问题讨论】: