2016-05-15 3 views
0

У меня есть следующие члены смарта-класс указателя:доступ к частным memers класса в CTOR

T *local_raw_ptr; 
const memory_management_type local_type; 

где memory_management_type является перечислением. Чтобы сделать неявное приведение к базовым классам я хочу реализовать этот CTOR:

template< 
      typename T2, 
      typename = typename std::enable_if<std::is_base_of<T, T2>::value>::type 
    > 
    pointer(const pointer<T2>& ptr):local_type(ptr.local_type), local_raw_ptr(ptr.local_raw_ptr) {}; 

но если я пытаюсь скомпилировать это я получаю эту ошибку:

pointer<Foo>::local_raw_ptr« is private within this context 

, почему я не могу получить доступ к частные члены этого класса в своем собственном constuctor? И как я могу решить эту проблему?

+0

нет в файле заголовка – Exagon

+1

В качестве шаблона ctor пройденный «указатель » будет неактуальным классом, его частные члены не могут быть доступны в текущем классе. – songyuanyao

+1

Ваш вопрос непонятен. Попробуйте дать MCVE (небольшой, но ПОЛНЫЙ образец кода, который показывает ту же проблему). При догадывании функция-член от 'pointer ' не сможет получить доступ к закрытым членам 'pointer ', так как 'pointer ' и 'pointer ' являются разными (не дружественными) классами, если только 'X' и 'Y' - то же самое. – Peter

ответ

2

Потому что каждый экземпляр класса шаблона отличается от других.

Так что если у вас есть pointer<Foo> и pointer<Bar> есть два разных классов и pointer<Foo> частные члены не доступны из pointer<Bar>.

Вы пытаетесь получить доступ к local_type из pointer<T2> от pointer<T> конструктор. Тот факт, что T2 является подтипом T, не имеет значения.

Смежные вопросы