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)
|
|
« Ответ #1 : 14-11-2010 06:40 » |
|
эм, и как ты число умножаешь на тип?
|
|
|
Записан
|
Странно всё это....
|
|
|
WDMclient
Гость
|
|
« Ответ #2 : 14-11-2010 06:50 » |
|
это не я умножаю , а VS 7.1
VS 7.0 тоже не умножает(как и я).
P.S. Из-за такой мелочи проект немогу перенести из 7.0 в 7.1
|
|
« Последнее редактирование: 14-11-2010 06:53 от WDMclient »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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 тоже не умножает(как и я).
а если удалить эту фигню ? ) Точно так же можно удалить и это
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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'
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 14-11-2010 09:14 » |
|
Интересно а как этому отнесется VS.8.0 (у меня нет ее под рукой) ?
в девятке тоже ругается. а вот так если или, как вариант, сменить class cls_2:private cls_1 { на class cls_2:public cls_1 {
|
|
« Последнее редактирование: 14-11-2010 09:19 от Алексей1153++ »
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
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
Молодой специалист
Offline
|
|
« Ответ #11 : 14-11-2010 13:07 » |
|
Dimka, Тут нет множественного наследования,а раз нет, то и явно указывать предка при обращении к функции не нужно.
Антон (LogRus), ))) это ты что-то очень хорошо праздновал, ну или сообщение уже успели отредактировать.
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 14-11-2010 13:20 » |
|
lapulya, а что празднуем ? ) компилятор успокаивается.
да, но мне всё равно один момент непонятен. Ведь класс объявлен снаружи, а тут выглядит, как-будто для класса cls_3 класс cls_1 стал быть объявлен так class cls_2 { class cls_1 { }; };
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #13 : 14-11-2010 13:45 » |
|
Тут нет множественного наследования,а раз нет, то и явно указывать предка при обращении к функции не нужно. А причём тут обращение к функции? И причём тут "тут нет"? Как в Писании сказано: Трезвитесь, бодрствуйте...
|
|
« Последнее редактирование: 14-11-2010 13:46 от Dimka »
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Антон (LogRus)
|
|
« Ответ #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
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #15 : 15-11-2010 08:46 » |
|
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)
|
|
« Ответ #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
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #17 : 15-11-2010 14:38 » |
|
А так я не понимаю, что такое injected-class-name. Но можно считать это фичей.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Антон (LogRus)
|
|
« Ответ #18 : 15-11-2010 14:42 » |
|
да стандартизованная фича
|
|
|
Записан
|
Странно всё это....
|
|
|
|