Я пытаюсь специализировать шаблон следующим образом:
class PropertyBase
{
public:
SfPropertyBase(string name)
{
Name = name;
}
virtual ~SfPropertyBase() {}
string Name;
virtual bool FromString(Object* obj, string str) = 0;
};
template< typename T>
class Property : public SfPropertyBase
{
public:
Property(string name) : SfPropertyBase(name)
{
//specific to Property stuff
}
template<typename U = T>
typename std::enable_if<(std::is_class<U>::value && std::is_pointer<U>::value), bool>::type
FromString(Object* obj, string str)
{
//do something
return true;
}
template<typename U = T>
typename std::enable_if<!std::is_class<U>::value || !std::is_pointer<U>::value), bool>::type
FromString(Object* obj, string str)
{
//do something
return true;
}
}
Затем, когда я пытаюсь инициализировать экземпляр этого класса:
auto prop = new Property<int>("IntProperty");
Я получаю invalid new-expression of abstract class type Property<int>
. Я понимаю, что в PropertyBase
есть абстрактная функция, но я также предоставляю обе специализации для Property
, где T
- это класс, а где - нет.
Что происходит и как это исправить?
Примечание: я хочу добиться специализации FromString
, если T - это класс / указатель, и все другие случаи.