Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

внук родительского класса не может работать с полями дедовского класса; почему? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Работа со стеком http://www.cyberforum.ru/cpp-beginners/thread313836.html
Используя стек, проверить, является ли содержимое текстового файла правильной записью формулы следущего вида: <формула>::=<цифра>|(<формула><знак><формула>) <знак>::=+|-|* <имя>::=x | y |z...
C++ Подсчитать количество строк Доброго времени суток! Дано задание: В текстовом файле подсчитать количество строк, которые начинаются и оканчиваются одной и той же буквой,вывести эти строки и их количество в новый файл. Я... http://www.cyberforum.ru/cpp-beginners/thread313831.html
Нахождение в структуре одинаковых элементов C++
Задача довольно простая, не получается одна вещь - не знаю, чего то не до пру.. Сама задача: вводим структуру из 3 элементов Автор, книга, год - таких авторов с книгами тоже 3. Как только ввели...
C++ Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted
Добрый день подскажите что это означает и как исправить данное сообщение Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted #include <iostream> #include <locale> #include...
C++ Разработать программу, которая выводит, например, на экран следующую таблицу из введенных данных http://www.cyberforum.ru/cpp-beginners/thread313759.html
Примерное задание Разработать программу, которая выводит, например, на экран следующую таблицу из введенных данных:
C++ Защита от дураков В функцию добавления, нужно добавить защиту от дураков: void Newadd() { Abbase z2; system ("cls"); cout <<"Abbase 0.51 final"<<endl; cout <<"\n"<<endl; fstream fout("base.txt",... подробнее

Показать сообщение отдельно
CyBOSSeR
Эксперт C++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
06.06.2011, 11:02
Косяк действительно с областями видимости, using решает проблему:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Base {
 public:
  int field_;
};
 
template <class Tp_>
class One: public Base {
 public:
  void MethodOne() {
    field_ = 0;
 }
};
 
template <class Tp_>
class Two: public One<Tp_> {
 using Base::field_;
 
 public:
  void MethodTwo() {
    field_ = 0;  // ок
  }
};
Хм... За пределами класса все нормально видится:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Base {
 public:
  int field;
};
 
template <class T>
class One: public Base {
};
 
template <class T>
class Two: public One<T> {
};
 
int main()
{
  Two<int> two;
  two.field = 100; // ок
}
Добавлено через 39 минут
Есть идея почему так происходит, но, естественно, я могу ошибаться.
Дело в том, что компилятор до инстанцирования vnuk не знает, что есть g, так как могут иметь место специализации sinn, в которых g может быть чем угодно - методом, именем типа, другим полем и т.д. Т.е. получается то, чем будет являтся g будет зависеть от аргумента шаблона, а к зависимым именам применяются другие правила поиска.

Добавлено через 26 минут
Похоже, ответ таится здесь:
Цитата Сообщение от C++98 14.6.2.3
In the definition of a class template or in the definition of a member of such a template that appears outside of the template definition, if a base class of this template depends on a template-parameter, the base class scope is not examined during name lookup until the class template is instantiated
Добавлено через 33 минуты
В стандарте C++03 пункт 14.6.2.3 имеет несколько другую формулировку, и говорит о том что unqualified имена не ищутся в базовых шаблонных классах ни при определении класса ни при его инстанцировании, что собственно наблюдается в данном случае.
6
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru