我做了两个测试类:
class Class1
{
public:
Class1(int a) {}
};
class Class2
{
public:
Class2() {}
};
使用SFINAE类型的两个模板函数来决定使用哪个。如果T不是默认可构造的,那么第二个将“失败”。
template<typename T>
T* CreateInstanceTest(char*[!std::is_default_constructible<T>::value] = 0) { return nullptr; }
template<typename T>
T* CreateInstanceTest(char*[std::is_default_constructible<T>::value] = 0) { return new T(); }
然后我这样做:
Class1* obj1 = CreateInstanceTest<Class1>();
Class2* obj2 = CreateInstanceTest<Class2>();
生成错误“多个重载函数实例”CreateInstanceTest“匹配参数列表”。
然而,它编译良好并按预期工作。 obj1变为null并且正确创建了obj2。
为什么会这样?有没有办法解决它?
答案 0 :(得分:3)
这是一个Intellisense错误,而不是构建错误。智能感知并不完美,但作为一种解决方法,您可以改进演绎代码:
template<typename T> typename ::std::enable_if_t
<
!::std::is_default_constructible<T>::value
, T *
>
CreateInstanceTest(void) { return nullptr; }
template<typename T> typename ::std::enable_if_t
<
::std::is_default_constructible<T>::value
, T *
>
CreateInstanceTest(void) { return new T(); }