Move OffsetTo operator+ back out of class

Apparently there's different overload resolution rules that apply, at
least with some (older?) version of gcc.

hb-ot-name-table.hh: In member function ‘void OT::name::accelerator_t::init(hb_face_t*)’:
hb-ot-name-table.hh:244:62: error: ambiguous overload for ‘operator+’ (operand types are ‘hb_blob_ptr_t<OT::name>’ and ‘OT::NNOffsetTo<OT::UnsizedArrayOf<OT::IntType<unsigned char, 1u> > > {aka const OT::OffsetTo<OT::UnsizedArrayOf<OT::IntType<unsigned char, 1u> >, OT::IntType<short unsigned int, 2u>, false>}’)
       this->pool = (const char *) (const void *) (this->table+this->table->stringOffset);
                                                              ^
hb-ot-name-table.hh:244:62: note: candidates are:
hb-ot-name-table.hh:244:62: note: operator+(const C*, long int) <built-in>
hb-ot-name-table.hh:244:62: note: operator+(const char*, long int) <built-in>
This commit is contained in:
Behdad Esfahbod 2019-05-15 00:52:17 -07:00
parent b213042f87
commit e01c7b1648
1 changed files with 9 additions and 9 deletions

View File

@ -279,15 +279,6 @@ struct OffsetTo : Offset<OffsetType, has_null>
return StructAtOffset<Type> (base, *this);
}
template <typename Base>
friend const Type& operator + (const Base *base, const OffsetTo &offset) { return offset (base); }
template <typename Base>
friend const Type& operator + (const OffsetTo &offset, const Base *base) { return offset (base); }
template <typename Base>
friend Type& operator + (Base *base, OffsetTo &offset) { return offset (base); }
template <typename Base>
friend Type& operator + (OffsetTo &offset, Base *base) { return offset (base); }
Type& serialize (hb_serialize_context_t *c, const void *base)
{
return * (Type *) Offset<OffsetType>::serialize (c, base);
@ -366,6 +357,15 @@ using NNOffsetTo = OffsetTo<Type, OffsetType, false>;
template <typename Type>
using LNNOffsetTo = LOffsetTo<Type, false>;
template <typename Type, typename OffsetType=HBUINT16, bool has_null=true, typename Base>
static inline const Type& operator + (const Base *base, const OffsetTo<Type, OffsetType, has_null> &offset) { return offset (base); }
template <typename Type, typename OffsetType=HBUINT16, bool has_null=true, typename Base>
static inline const Type& operator + (const OffsetTo<Type, OffsetType, has_null> &offset, const Base *base) { return offset (base); }
template <typename Type, typename OffsetType=HBUINT16, bool has_null=true, typename Base>
static inline Type& operator + (Base *base, OffsetTo<Type, OffsetType, has_null> &offset) { return offset (base); }
template <typename Type, typename OffsetType=HBUINT16, bool has_null=true, typename Base>
static inline Type& operator + (OffsetTo<Type, OffsetType, has_null> &offset, Base *base) { return offset (base); }
/*
* Array Types