41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 308
1

Base-Protected-поле доступно в Derived, но недоступно, если Base и Derived определены вложенными в шаблон класса Wrap

31.08.2017, 00:26. Показов 1197. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ситуация такая:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Base {
  public:
    virtual void foo() { };
    
  protected:
    int x;
};
 
class Derived: Base {
  public:
    virtual void foo() {
        cout << "Change X: " << ++x << endl;
    }
};

Эта штука работает. Если обернуть это во Wrap, то всё до сих пор работает:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
class Wrap {
class Base...
class Derived...
};


Стоит сделать класс Wrap шаблоном, как поле x оказывается недоступным:

Код
error: 'x' was not declared in this scope
         cout << "Change X: " << ++x << endl;
                                   ^
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <class T>
class Wrap {
    class Base {
      public:
        virtual void foo() { };
        
      protected:
        int x;
    };
    
    class Derived: Base {
      public:
        virtual void foo() {
            cout << "Change X: " << ++x << endl;
        }
    };
};


Если попытаться указать, что Derived наследуется именно от Wrap<T> (Wrap<T>::Base), то результат тот же.

Что я делаю не так и почему?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.08.2017, 00:26
Ответы с готовыми решениями:

Cast to Base class from Derived class
Привет, подскажите, надо сделать каст чтобы затем сделать сериализацию а не работает на С#...

Поле protected доступно в другом объекте другого класса?
A = class private ind: Intege; protected proc SetInt(i: integer); end; B =...

derived class
Привет. Что-то я туплю под вечер и никак не соображу, как сделать чтобы сначала вызывался метод...

10 BASE 5 и 10 BASE FL материал для курсовой работы
Всем привет. У меня такой вопрос, пишу курсовую по сетям. У меня сетевая технологий кабеля 10 BASE...

12
Неэпический
17848 / 10616 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1
31.08.2017, 00:34 2
C++
1
++Base::x/*this->x*/
???
0
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 308
31.08.2017, 00:42  [ТС] 3
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
++Base::x/*this->x*/
???
Если это претензия про инициализацию, то давайте опустим банальности - она есть, конечно же.
0
Эксперт С++
8737 / 4315 / 960
Регистрация: 15.11.2014
Сообщений: 9,762
31.08.2017, 00:45 4
Лучший ответ Сообщение было отмечено Lyosha12 как решение

Решение

Цитата Сообщение от Lyosha12 Посмотреть сообщение
cout << "Change X: " << ++x << endl;

C++
1
cout << "Change X: " << ++this->x << endl;
Почему компилируется не объявленная переменная в шаблоне?

Почему компилируется не объявленная переменная в шаблоне?
1
Неэпический
17848 / 10616 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1
31.08.2017, 01:04 5
Цитата Сообщение от Lyosha12 Посмотреть сообщение
Если это претензия про инициализацию
Это способы как можно обратиться к x.
0
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 308
31.08.2017, 01:07  [ТС] 6
Забавно. Как исправить - понятно, но почему это так - до сих пор не интуитивно.
Можете привести простенький пример, где эта особенность будет явно очевидна?
Может, что-то со специализацией обёртки?
0
Эксперт С++
8737 / 4315 / 960
Регистрация: 15.11.2014
Сообщений: 9,762
31.08.2017, 03:01 7
Цитата Сообщение от Lyosha12 Посмотреть сообщение
Можете привести простенький пример, где эта особенность будет явно очевидна?
см #4
0
Эксперт С++
1623 / 953 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 30
31.08.2017, 10:24 8
Ещё вариант
C++
1
2
3
4
5
 public:
      using Base::x;
        virtual void foo() {
            cout << "Change X: " << ++x << endl;
        }
1
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 308
31.08.2017, 10:31  [ТС] 9
Окей. Ниже я увидел выписку из стандарта. Если более развёрнутого описания мне не суждено увидеть, то ограничусь только ссылкой на стандарт. Благодарю.
0
Неэпический
17848 / 10616 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1
31.08.2017, 10:43 10
Цитата Сообщение от Lyosha12 Посмотреть сообщение
Если более развёрнутого описания мне не суждено увидеть
Пост #4. Ссылка 2.
0
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 308
31.08.2017, 10:47  [ТС] 11
Цитата Сообщение от Croessmah Посмотреть сообщение
Пост #4. Ссылка 2.
Я и имел в виду тот пост. Это объяснение "на пальцах" мне не совсем понятно, так как я не знаком с шаблонами настолько плотно, чтобы представить варианты "небо" и "земля". Может, в какой-то книге это описано лучше?
0
18161 / 9494 / 2322
Регистрация: 30.01.2014
Сообщений: 16,599
31.08.2017, 10:55 12
Лучший ответ Сообщение было отмечено Lyosha12 как решение

Решение

Цитата Сообщение от Lyosha12 Посмотреть сообщение
Может, в какой-то книге это описано лучше?
В книге "Шаблоны C++. Справочник разработчика"
1
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 308
31.08.2017, 11:02  [ТС] 13
Цитата Сообщение от DrOffset Посмотреть сообщение
В книге "Шаблоны C++. Справочник разработчика"
Благодарю.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.08.2017, 11:02
Помогаю со студенческими работами здесь

Напишитефункцию integerPower(base exponent) ,какая возвращает значение base exponent.
Напишитефункцию integerPower(base exponent) ,какая возвращает значение base exponent. Например,...

Protected abstract virtual base pure virtual private destructor
Хай, all) Вопрос не для начинающих и дурацкий) В разделе для экспертов публиковать не стал, чтобы...

Поменять местами поле в таблице Libre Base
Есть в таблице tb1 столбцы first_field (varchar) и second_field (varchar). Ищу ответ как в Libre...

Base Url класса /index.php?data=s1/
Добрый день, возможно ли задать BASE url класса http://domain.net/index.php?data=s1/, если base url...

Обращение к методам базового класса (есть ли подобие base/super?)
Понятное дело, что можно обращаться к методам базового класса так: BaseClass::hisMethod(); Однако...

В приведенном коде base может изменить значения членов базового класса в самом базовом классе
using System; class a { public int x; public a() { x = 122; } }...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru