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

базовый и производный класс, в базовом объявлена переменная "protected", она недоступна по имени в производном классе! template <class T> воду мутит! - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Выполнить обработку текста http://www.cyberforum.ru/cpp-beginners/thread318495.html
Друзья, помогите пожалуйста: Выполнить обработку текста из внешнего текстового файла, созданного в редакторе. Результаты обработки поместить во внешний файл.Определить количество слов в каждой...
C++ Оверлейные функции Оверлейные функции - это какие? http://www.cyberforum.ru/cpp-beginners/thread318459.html
C++ Вывод на экран точки белого цвета
Вопрос состоит из 3 вопросов. 1. напишите код на С который выводит белую точку. 2. как работает функция printf так что она выводит именно на ЭКРАН. 3. опишите вкратце как управлять с помощью С...
C++ Упорядочивание элементов массива
Постановка задачи. Разработать программу, которая вводит целочисленную матрицу из n строк и m столбцов (1<n<=100, 1<m<=50) и упорядочивает элементы матрицы. Правило упорядочивания определяется...
C++ Массивы http://www.cyberforum.ru/cpp-beginners/thread318415.html
Дан массив ненулевых целых чисел размера N. Проверить, образуют ли его элементы геометрическую прогрессию (см. задание Array4). Если образуют, то вывести знаменатель прогрессии, если нет — вывести 0....
C++ Синтаксический анализ Много кто берётся но мало кто доводит до конца эту тему... Я написал класс Expression смысл которого сводится к тому, чтобы вычислить значение математического выражения переданного в виде string либо... подробнее

Показать сообщение отдельно
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,498

базовый и производный класс, в базовом объявлена переменная "protected", она недоступна по имени в производном классе! template <class T> воду мутит! - C++

12.06.2011, 22:52. Просмотров 1284. Ответов 9
Метки (Все метки)

Друзья! Вот код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
template <class T>
class otets {
 protected:
  int peremennaya;
};
 
template <class T>
class sinn: public otets<T> {
 void  f ();  
};
 
template <class T>
void sinn<T>::f () {
 otets<T>::peremennaya= 11;
 sinn<T>::peremennaya= 11;
 //peremennaya= 11;
}
 
int main() {
 sinn<int> h;
 printf ("%x\n", &h.otets<int>::peremennaya);
 printf ("%x\n", &h.sinn<int>::peremennaya);
 printf ("%x\n", &h.peremennaya);
 getchar ();
}
{}
Вот какое-то несерьёзное поведение компилятора g++; все знают, что поля protected базового класса наследуются производными, а значит, в классе sinn просто-таки ОБЯЗАНА присутствуовать переменная peremennaya, но её там нет! Нет её и всё, ибо

C++
1
peremennaya= 11;
Приводит к ошибке. Зато

C++
1
2
 otets<T>::peremennaya= 11;
 sinn<T>::peremennaya= 11;
компилится, в то время, как всё вот это:
otets<int>:eremennaya;
sinn<int>:eremennaya;
peremennaya;

НАходится ПО ОДНОМУ адресу, а значит, логично просто квалифицировать это поле как
peremennaya;

Не получается. Почему?

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Блин, MSVC без проблем компилит;
C++
1
2
3
otets<T>::peremennaya= 11;
 sinn<T>::peremennaya= 11;
peremennaya= 11;
придётся, наверное, прогнуться под g++ и не писать:

C++
1
peremennaya= 11;
, я разачаровываюсь в g++


Ну и сразу вопрос, как грамотнее будет писать для компиляторосовместимости:
C++
1
2
3
4
template <class T>
void sinn<T>::f () {
 otets<T>::peremennaya= 11;
}
или

C++
1
2
3
4
template <class T>
void sinn<T>::f () {
  sinn<T>::peremennaya= 11;
}
, имея ввиду, что это суть одно и то же? Спасибо

Добавлено через 17 минут
Вообще вся эта катавасия опять определяется template <class T>! Уибраем сие и всё компилится нормально!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
class otets {
 public:
  int peremennaya;
};
 
class sinn: public otets {
 void  f ();  
};
 
void sinn::f () {
 otets::peremennaya= 11;
 sinn::peremennaya= 11;
 peremennaya= 11;
};
 
int main() {
 sinn h;
 printf ("%x\n", &h.otets::peremennaya);
 printf ("%x\n", &h.sinn::peremennaya);
 printf ("%x\n", &h.peremennaya);
 getchar ();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru