Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: VS 7.0 7.1 (глюк?)  (Прочитано 16603 раз)
0 Пользователей и 7 Гостей смотрят эту тему.
WDMclient
Гость
« : 14-11-2010 06:22 » 

Ниже указаный код  не вызывает проблем у  VS7.0  (у борланда.6.0 тоже кстати)

А вот   VS.7.1  утверждает что  класс cls_1 недоступен из cls_3.


Можно поменять   private cls_1  на  public cls_1   и  все ОК.     Но  при чем тут это.


class    cls_1 {
};


class cls_2:private cls_1 {
};


class cls_3:public cls_2{

      int   func_3()
     {
           cls_1 * k;    // вот это место типа-ошибка
           return 0;
    }
};


Интересно а  как этому отнесется VS.8.0  (у меня нет ее под рукой)  ?



« Последнее редактирование: 14-11-2010 09:04 от WDMclient » Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #1 : 14-11-2010 06:40 » 

эм, и как ты число умножаешь на тип?
Записан

Странно всё это....
WDMclient
Гость
« Ответ #2 : 14-11-2010 06:50 » new

это не я умножаю    ,  а   VS 7.1  


VS 7.0  тоже не умножает(как и я).


P.S.
Из-за такой мелочи проект немогу перенести из  7.0  в  7.1
« Последнее редактирование: 14-11-2010 06:53 от WDMclient » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 14-11-2010 07:44 » 

это не я умножаю    ,  а   VS 7.1 
VS 7.0  тоже не умножает(как и я).
а если удалить эту фигню ? )
Записан

WDMclient
Гость
« Ответ #4 : 14-11-2010 07:51 » 

Зачем?
Записан
WDMclient
Гость
« Ответ #5 : 14-11-2010 08:00 » 

это не я умножаю    ,  а   VS 7.1 
VS 7.0  тоже не умножает(как и я).
а если удалить эту фигню ? )


Точно так же можно удалить и это
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 14-11-2010 08:06 » 

кстати. При чём тут умножение. Это объявление указателя.
Код:
cls_1 * k;    // вот это место типа-ошибка

Добавлено через 1 минуту и 2 секунды:
но тут опять не всё понятно. Клас же в общей видимости определён

Добавлено через 1 минуту и 42 секунды:
подозреваю, что там у тебя нифига не ошибка, а warning (неиспользованная переменная). А также включена опция "считать предупреждения ошибками"
« Последнее редактирование: 14-11-2010 08:38 от Алексей1153++ » Записан

WDMclient
Гость
« Ответ #7 : 14-11-2010 08:45 » 



 error C2248: 'cls_1' : cannot access inaccessible class declared in class 'cls_3'
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 14-11-2010 09:14 » 

Цитата
Интересно а  как этому отнесется VS.8.0  (у меня нет ее под рукой)  ?
в девятке тоже ругается.



а вот так если
Код:
::cls_1 * k;

или, как вариант, сменить

Код:
class cls_2:private cls_1 {
на
Код:
class cls_2:public cls_1 {

« Последнее редактирование: 14-11-2010 09:19 от Алексей1153++ » Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 14-11-2010 10:02 » 

В GCC 4.2.1 то же самое.

Из-за множественного наследования в C++, чтобы обратиться к функциям класса-предка, нужно указывать имя класса. Подозреваю, что именно из-за этого клинит компилятор - он воспринимает имя класса как обращение к предку, которое из-за private-наследования запрещено. Как предложил Алексей1153++, если явно указать глобальную область видимости, компилятор успокаивается.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
WDMclient
Гость
« Ответ #10 : 14-11-2010 12:16 » 

Ну в общем да.


       ::cls_1 * k;   


совсем я забыл про эти namespaces


THANKS!

Добавлено через 7 минут и 31 секунду:
Меня сбило с толку , что  не впределах функции объявленый указатель обходиться без указания области имен
« Последнее редактирование: 14-11-2010 12:23 от WDMclient » Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #11 : 14-11-2010 13:07 » 

Dimka, Тут нет множественного наследования,а раз нет, то и явно указывать предка при обращении к функции не нужно.

Антон (LogRus), ))) это ты что-то очень хорошо праздновал, ну или сообщение уже успели отредактировать.
Записан

С уважением Lapulya
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 14-11-2010 13:20 » 

lapulya, а что празднуем ? )



компилятор успокаивается.
да, но мне всё равно один момент непонятен. Ведь класс объявлен снаружи, а тут выглядит, как-будто для класса cls_3 класс cls_1 стал быть объявлен так

class cls_2
{
   class cls_1
   {
   };
};

Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 14-11-2010 13:45 » 

Цитата: lapulya
Тут нет множественного наследования,а раз нет, то и явно указывать предка при обращении к функции не нужно.
А причём тут обращение к функции? И причём тут "тут нет"? Улыбаюсь

Как в Писании сказано:
Цитата: 1 Пет. 5:8
Трезвитесь, бодрствуйте...
Улыбаюсь
« Последнее редактирование: 14-11-2010 13:46 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #14 : 15-11-2010 03:28 » 

кстати. При чём тут умножение. Это объявление указателя.
Код:
cls_1 * k;    // вот это место типа-ошибка
Антон (LogRus), ))) это ты что-то очень хорошо праздновал, ну или сообщение уже успели отредактировать.

Всё болше не буду читать форум с мобильного и через строчку Улыбаюсь

почтал стандарт, если быть точным, то драфт нового стандарта
параграф 11.2   Accessibility of base classes and base class members
явно говорит, что компилятор прав
Цитата
Note: A member of a private base class might be inaccessible as an inherited member name, but accessible directly. Because of the rules on pointer conversions (4.10) and explicit casts (5.4), a conversion from a pointer to a derived class to a pointer to an inaccessible base class might be ill-formed if an implicit conversion is used, but well-formed if an explicit cast is used. For example,
Код:
class B { public:
     int mi;
     static int si;
};
class D : private B { };
class DD : public D {
     void f();
};
void DD::f() { mi = 3;
     si = 3; ::B b; b.mi = 3; b.si = 3; ::B::si = 3; ::B* bp1 = this; ::B* bp2 = (::B*)this;
     // non-static member // static member
     // error: mi is private in D // error: si is private in D
     // OK (b.mi is different from this->mi) // OK (b.si is different from this->si) // OK // error: B is a private base class
     // OK with cast
     bp2->mi = 3; // OK: access through a pointer to B.
}
« Последнее редактирование: 15-11-2010 03:33 от Антон (LogRus) » Записан

Странно всё это....
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 15-11-2010 08:46 » 

Цитата: Антон (LogRus)
Note: A member of a private base class might be inaccessible as an inherited member name, but accessible directly. Because of the rules on pointer conversions (4.10) and explicit casts (5.4), a conversion from a pointer to a derived class to a pointer to an inaccessible base class might be ill-formed if an implicit conversion is used, but well-formed if an explicit cast is used.
Примечание: Член закрытого базового класса может быть недоступным как имя наследуемого члена, но доступным напрямую. Из-за правил приведения указателей (4.10) и явных приведений (5.4) приведение указателя на производный класс к недоступному базовому классу может быть некорректным, если используется неявное приведение, но корректным, если используется явное приведение.

Если я ничего не упустил в переводе, то это примечание ничего не объясняет. У нас нет члена закрытого базового класса, у нас нет указателя на производный класс, который бы приводился к указателю на базовый класс. У нас есть член производного класса, являющийся указателем базового класса. И это никак не объясняет, почему в примере написано "::B b", а не просто "B b".
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #16 : 15-11-2010 09:06 » 

а так
Цитата
Note: In a derived class, the lookup of a base class name will find the injected-class-name instead of the name of the base class in the scope in which it was declared. The injected-class-name might be less accessible than the name of the base class in the scope in which it was declared. — end note ]
 Example:
Код:
class A { }
class B : private A { };
class C : public B {
A *p; // error: injected-class-name A is inaccessible
::A *q; // OK
};
Записан

Странно всё это....
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 15-11-2010 14:38 » 

А так я не понимаю, что такое injected-class-name. Но можно считать это фичей. Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #18 : 15-11-2010 14:42 » 

да стандартизованная фича Улыбаюсь
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines