Друг зависимое имя типа шаблона класса

У меня 3 класса, Device, Register, а также WriteOnlyPolicyопределяется как таковой:

class Device
{
public:

template<class Register>
inline void write(typename Register::value_type value)
{
Register::writeRegister(value, this);
}

protected:

// limit device-specific API calls to this function
virtual void writeDeviceRegister(uint64_t address, uint64_t value) = 0;

};
template<uint64_t ADDRESS, class ValueType, template<class> class AccessPolicy>
struct Register : public AccessPolicy<ValueType>
{
using value_type = ValueType;
using access_policy = AccessPolicy<ValueType>;

static void writeRegister(value_type value, Device* device)
{
access_policy::write(ADDRESS, device, value);
}
}
template<typename value_type>
class WriteOnlyPolicy
{
protected:

static void write(uint64_t ADDRESS, Device* device, value_type value)
{
// convert from a value_type to a uint64_t...
// Shift/mask as needed...
device->writeDeviceRegister(ADDRESS, value);
}
};

Register а также WriteOnlyPolicy на самом деле никогда не создаются в этой схеме, но я хочу, чтобы политика вызывала защищенную writeDeviceRegister функция Device учебный класс. Я не хочу, чтобы эта функция была публичной, так как я хочу только write функция для пользователей класса, а не для конкретной реализации устройства.

Для того, чтобы позволить, что я хочу Device другу Register::access_policy (который в этом случае будет WriteOnlyPolicy класс, заданный в качестве аргумента шаблона), но я не могу понять синтаксис для друга зависимого типа имени класса шаблона. Это возможно?

Я думал, что положить friend декларация в Device класс, такой как

template<uint64_t a, class b, template<class> class c>
friend typename Register<a,b,c>::access_policy;

сделал бы трюк, но я получаю ошибку

ошибка: ожидаемый неквалифицированный идентификатор перед ‘;’ знак

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector