VS2015中的SFINAE类型编译,但会生成错误

时间:2017-09-30 09:13:45

标签: c++ templates visual-studio-2015 sfinae

我做了两个测试类:

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。

为什么会这样?有没有办法解决它?

1 个答案:

答案 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(); }