Что я могу сделать, чтобы сделать эту работу:
template<class C, class V, Test V::*>
class Test {
};
это дает мне ошибку компилятора:
unknown type name 'Test'
Это самоссылочный шаблон на данный момент, который не кажетсявозможный.Что можно сделать, чтобы заставить его работать?
РЕДАКТИРОВАТЬ:
Вот для чего мне это нужно.Я хочу реализовать двунаправленную (думаю, родитель-дочернюю) схему отношений с наименьшим минимумом усилий по написанию кода.
template <class O, class T, Reference<T, O, Reference O::*> T::* opposite>
class Reference
{
T **data;
int count;
public:
Reference(): data(new T*[N]), count(0) {}
~Reference() {delete[] data;}
Reference &add(T *t) {
handleOtherSide();
return link(t);
}
// a lot of stuff to implement this
};
Это класс коллекции.Вот как это будет использоваться:
class Partner
{
public:
Reference<Partner, Address, &Address::partner> addresses;
};
class Address
{
public:
Reference<Address, Partner, &Partner::addresses> partner;
};
Моя цель - предоставить все необходимое для работы Reference в качестве аргумента шаблона, чтобы не было необходимости предоставлять конструкторы для таких классов, как Partner и Address (в настоящее времяЯ предоставляю противоположный указатель на член в качестве конструктора arg, но для этого требуется наличие явных конструкторов для классов участников).Мне также нужно было бы передать или вычислить указатель «владельца» на класс Reference.Я оставил эту проблему здесь, потому что я хочу сосредоточиться на аспекте шаблона самоссылки.
Самый простой способ думать об этом - boost :: bimap.Но проблема с bimap заключается в том, что я не хочу вмещающий bimap, а только его левую и правую части.bimap также неосуществим, потому что это приведет к тому, что один bimap будет управлять всеми ассоциациями определенных отношений.Возможно, он будет содержать большое количество объектов, замедляющих операции на нем.