Неполные типы.
Фрагмент кода
struct Dir : DirName , MemBase_nocopy
{
CompactRBTreeMap<StrKey,Entry> entries;
CompactRBTreeMap<StrKey,OwnPtr<Dir> > dirs;
....
};
Если я добавляю концепт в определение OwnPtr, то это не компилируется, поскольку в выделенной точке Dir -- неполный тип.
Та же проблема возникает при использовании CRRT паттерна.
template <class T>
struct CmpComparable
{
friend bool operator < (const T &a,const T &b) requires ( Has_objCmp<T> ) { return a.objCmp(b)<0; }
friend bool operator > (const T &a,const T &b) requires ( Has_objCmp<T> ) { return a.objCmp(b)>0; }
friend bool operator <= (const T &a,const T &b) requires ( Has_objCmp<T> ) { return a.objCmp(b)<=0; }
friend bool operator >= (const T &a,const T &b) requires ( Has_objCmp<T> ) { return a.objCmp(b)>=0; }
friend bool operator == (const T &a,const T &b) requires ( Has_objCmp<T> ) { return a.objCmp(b)==0; }
friend bool operator != (const T &a,const T &b) requires ( Has_objCmp<T> ) { return a.objCmp(b)!=0; }
};
class SomeClass : public CmpComparable<SomeClass>
{
....
};
Здесь приходится спускать ограничения на уровень методов, чтобы работало.