Добрый вечер. Хочу унифицировать работу с данными разных типов. Для этого вокруг данных строится класс, который дополняет данные свойствами. Для работы с данными предусмотрены методы чтения/записи. Для каждого типа данных должна быть своя специализация. При этом, если объявляется экземпляр с типом данных, для которого нет специализации, то должна быть ошибка во время компиляции. Вот как это реализовано:
struct CValueBase
{
enum STATUS { INITED, UNKNOWN };
STATUS Status;
CValueBase() { Status = UNKNOWN; }
bool IsInited() { return Status==INITED; }
STDMETHOD(Write)(VARIANT Val) PURE;
STDMETHOD(Read)(VARIANT *pVal) PURE;
};
template<typename T>
struct CValue : public CValueBase
{
T Value;
STDMETHOD(Read)(VARIANT *pVal)
{
if ( Status==UNKNOWN ) return E_FAIL;
return CComVariant(Value).Detach(pVal);
}
STDMETHOD(Write)(VARIANT Val) PURE; // [1]
};
template<> STDMETHOD(CValue<bool>::Write)(VARIANT Val)
{
Value = Val.boolVal==VARIANT_TRUE;
return S_OK;
}
CValue<bool> test;
Если отсутствует строка, отмеченная коментарием [1], то компилятор ругается (error C2244: 'CValueBase::Write' : unable to match function definition to an existing declaration). Если строка есть, то при определении экземпляра test не используется специализация и компилятор снова ругается (error C2259: 'CValue<T>' : cannot instantiate abstract class). Что-то не пойму, что тут нетак