Can anyone explain why the code below gives the error "error C2259: 'PropertyValue': cannot instantiate abstract class" in Visual Studio 2015 C++?
Is the compiler not able to identify that the conditionally specified function ConvertToDevice() in the derived class PropertyValue has the same signature?
Many thanks,
John
#include <type_traits>
#include <typeinfo>
class BasePropertyValue
{
public:
    virtual int ConvertToDevice(void** ptrdObject) = 0;
};
template<typename T>  class PropertyValue : public BasePropertyValue
{
    public:
    T value;
    PropertyValue(T val)
    {
        value = val;
    }
    template<class Q = T>
    typename std::enable_if<!std::is_pointer<Q>::value, int>::type ConvertToDevice(void** ptrdObject)
    {
        return 1;
    }
    template<class Q = T>
    typename std::enable_if<std::is_pointer<Q>::value, int>::type ConvertToDevice(void** ptrdObject)
    {
        return 2;
    }
};
void main()
{
    PropertyValue<double>* prop1 = new PropertyValue<double>(20);
    prop1->ConvertToDevice(nullptr);
    double x = 20;
    PropertyValue<double*>* prop2 = new PropertyValue<double*>(&x);
    prop2->ConvertToDevice(nullptr);
    return;
}
[edit] This is not a duplicate question because of the conditional traits aspect.
 
     
    