При просмотре источника libstdc ++ выясняется, что определение функции-члена _Data_allocate
является результатом расширения макроса __ROPE_DEFINE_ALLOCS
в определении шаблона _Rope_base
(обратите внимание, что создание экземпляра шаблона rope<_CharT, _Alloc>
публично расширяет _Rope_base<_CharT, _Alloc>
).
Вы можете попробовать квалифицировать звонок на _Data_allocate
дальше. Вместо:
_Data_allocate(_S_rounded_up_size(__old_len + __len));
Попробуйте:
_Rope_base<_CharT, _Alloc>::_Data_allocate(_S_rounded_up_size(__old_len + __len));
Или просто:
_Base::_Data_allocate(_S_rounded_up_size(__old_len + __len));
из-за защищенного typedef _Rope_base<_CharT, _Alloc> _Base;
в определении rope<_CharT, _Alloc>
.
РЕДАКТИРОВАТЬ: У меня не установлен Clang локально, но я протестировал это с демонстрацией онлайн-компилятора Clang 3.0 .
Эта сильно урезанная версия не может быть скомпилирована с Clang 3.0 (ошибка: использование необъявленного идентификатора '_Data_allocate'):
#include <cstddef>
#include <memory>
template <typename _CharT, class _Alloc>
class _Rope_base : public _Alloc
{
public:
typedef typename _Alloc::template rebind<_CharT>::other _DataAlloc;
static _CharT * _Data_allocate(std::size_t __n) {
return _DataAlloc().allocate(__n);
}
};
template <typename _CharT, class _Alloc = std::allocator<_CharT> >
class rope : public _Rope_base<_CharT, _Alloc>
{
protected:
typedef _Rope_base<_CharT, _Alloc> _Base;
public:
rope()
{
_Data_allocate(0);
}
};
int main()
{
rope<char> r;
}
Уточняя вызов в _Data_allocate
любым из предложенных выше способов, Clang 3.0 успешно компилирует его.