GCC "using" bug?
От: comer США http://getboost.codeplex.com/
Дата: 22.02.03 17:47
Оценка:
Пытаюсь использовать using для шаблонной функции.
Такой вот пример:
struct A
{
    template<class R>
    void F(R)
    { // строка 5
    }
};

struct B: private A
{
    using A::F; // строка 11
};

int main()
{
    B b;
    b.F(3); // строка 17
    return 0;
}


VC 6 и Comeau скомпилировали нормально. А вот gcc version 3.2 20020818 (prerelease), выдал сообщение:

...: In function `int main()':
...:5: `void A::F(R) [with R = int]' is inaccessible
...:17: within this context


Самое печальное то что ошибку он выдал в строке 17. А не в строке 11, что было бы логичнго если GCC не может использовать using директиву для шаблонных функций , заметьте, других функции F больше нет в классе A.
getboost.codeplex.com
citylizard.codeplex.com
Re: GCC "using" bug?
От: Анатолий Широков СССР  
Дата: 23.02.03 20:02
Оценка:
Можно начать с малого:

struct A
{
    void f(int) {}    
};

struct B: A
{   
    using A::f;
    void f(char) {}
};


Вот результат:

>g++ --version
2.95.2-6

>g++ -o bug bug.cpp
bug.cpp:8: cannot adjust access to `void A::f(int)' in `struct B'
bug.cpp:9:   because of local method `void B::f(char)' with same name
Re[2]: GCC "using" bug?
От: comer США http://getboost.codeplex.com/
Дата: 24.02.03 15:28
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Можно начать с малого:

...

Это другой баг, и проявляеться он на версии GCC 2.95.*-*, в том числе на одной из последней (2.95.3-10). И этот баг в версии 2.95 команда GCC исправлять не будут, так как в ветке 2 они исправляют только фатальные вещи. GCC 3.2 твой пример компилирует нормально. А мой, нет. Думаю что это баг. Баг репорт уже кинул (9810), посмотрим что скажут.
getboost.codeplex.com
citylizard.codeplex.com
Re[2]: GCC "using" bug?
От: Юнусов Булат Россия  
Дата: 24.02.03 18:48
Оценка: 3 (1)
Здравствуйте, Анатолий Широков, Вы писали:

АШ>[code]

>>g++ --version
АШ>2.95.2-6

gcc научился делать импорт функций-членов базовых классов через using начиная с 3.0 версии
Все страньше и страньше, gcc 3.2 если скормить ему public наследование — съедает, а на protected или private — ругается сабжево.
Re: GCC "using" bug?
От: Raven_ua  
Дата: 24.02.03 22:52
Оценка:
Здравствуйте, comer, Вы писали:

C>Пытаюсь использовать using для шаблонной функции.

C>Такой вот пример:
C>
C>struct A
C>{
C>    template<class R>
C>    void F(R)
C>    { // строка 5
C>    }
C>};

C>struct B: private A
C>{
C>    using A::F; // строка 11
C>};

C>int main()
C>{
C>    B b;
C>    b.F(3); // строка 17
C>    return 0;
C>}
C>


C>VC 6 и Comeau скомпилировали нормально. А вот gcc version 3.2 20020818 (prerelease), выдал сообщение:


C>
C>...: In function `int main()':
C>...:5: `void A::F(R) [with R = int]' is inaccessible
C>...:17: within this context
C>


C>Самое печальное то что ошибку он выдал в строке 17. А не в строке 11, что было бы логичнго если GCC не может использовать using директиву для шаблонных функций , заметьте, других функции F больше нет в классе A.



GCC поддерживает директиву using. Ошибка произошла в строке 17 , а не в строке 11 потому что С++ использует в случае с шаблонами так называемую позднюю компиляцию, а это означает, что компиляция шаблона откладывается до его первой инициализации.
Попробуй скомпилировать с подключением библиотеки lstdc++ и проверь расширение файла (для С++ файла должно быть *.С).
Re[2]: GCC "using" bug?
От: comer США http://getboost.codeplex.com/
Дата: 25.02.03 17:42
Оценка:
Здравствуйте, Raven_ua, Вы писали:

RU>GCC поддерживает директиву using.

Конечно поддерживает, только с ошибками.

RU>Ошибка произошла в строке 17 , а не в строке 11 потому что С++ использует в случае с шаблонами так называемую позднюю компиляцию, а это означает, что компиляция шаблона откладывается до его первой инициализации.

Ой. Я совсем не то имел ввиду. Поставь public вместо private, а все прекрасно заработает, а using должен выносить в public ВСЕ ИМЕНА (не зависимо от того что это, шаблонные функции или типы или еще что). Вот в чем проблема.

RU>Попробуй скомпилировать с подключением библиотеки lstdc++ и проверь расширение файла (для С++ файла должно быть *.С).

Компилирую очень просто:
g++ test.cpp


Так что расширения файлов и lstdc++ тут не причем.
getboost.codeplex.com
citylizard.codeplex.com
Re[3]: GCC "using" bug?
От: comer США http://getboost.codeplex.com/
Дата: 25.02.03 18:19
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>Все страньше и страньше, gcc 3.2 если скормить ему public наследование — съедает, а на protected или private — ругается сабжево.

Будем ждать 3.3
getboost.codeplex.com
citylizard.codeplex.com
Re: GCC "using" bug?
От: Raven_ua  
Дата: 01.03.03 22:02
Оценка:
Здравствуйте, comer, Вы писали:

C>Пытаюсь использовать using для шаблонной функции.

C>Такой вот пример:
C>
C>struct A
C>{
C>    template<class R>
C>    void F(R)
C>    { // строка 5
C>    }
C>};

C>struct B: private A
C>{
C>    using A::F; // строка 11
C>};

C>int main()
C>{
C>    B b;
C>    b.F(3); // строка 17
C>    return 0;
C>}
C>


C>VC 6 и Comeau скомпилировали нормально. А вот gcc version 3.2 20020818 (prerelease), выдал сообщение:


C>
C>...: In function `int main()':
C>...:5: `void A::F(R) [with R = int]' is inaccessible
C>...:17: within this context
C>


C>Самое печальное то что ошибку он выдал в строке 17. А не в строке 11, что было бы логичнго если GCC не может использовать using директиву для шаблонных функций , заметьте, других функции F больше нет в классе A.


Здравствуйте comer.
В вашем примере используется using-объявление, а не using-директива. Using-директива это, например, using namespace или using <namespace>::member.

using-объявление не может использоваться для получения доступа к дополнительной информации.
Оно просто является механизмом предоставления более удобного доступа к информации, доступ к которой в принципе разрешен.
Б. Страуструп
Так, что в вашем примере нет ошибок и долгожданного «исправления» вы вряд ли дождетесь.

P.S. Работа вашего кода в VC++ остается на совести программистов Microsoft-а.
В Builder C++ 6.0 этот код не работает.
Re[2]: GCC "using" bug?
От: comer США http://getboost.codeplex.com/
Дата: 02.03.03 18:12
Оценка:
Здравствуйте, Raven_ua, Вы писали:

RU> В вашем примере используется using-объявление, а не using-директива. Using-директива это, например, using namespace или using <namespace>::member.

Спасибо, согласен.

RU>using-объявление не может использоваться для получения доступа к дополнительной информации.

Шаблоны это доп. информация? Если не может, то почему не выдать ошибку?

RU>Оно просто является механизмом предоставления более удобного доступа к информации, доступ к которой в принципе разрешен.

RU> Б. Страуструп

RU>Так, что в вашем примере нет ошибок и долгожданного «исправления» вы вряд ли дождетесь.

Ошибку выдает компилятор gcc. IMHO, не должен, так как, в любом случае, в НЕ ЗАВИСИМОТИ ОТ ТОГО ЧТО ГОВОРИТ СТАНДАРТ, в компиляторе либо реализовано использование using для имен шаблонов, либо нет, третьего не дано. Вот в чем ошибка (bug), и его неплохо было бы исправить, либо запретив использовать в using имени шаблона, либо разрешив, все остальное выгдядит как то бессмысленно, или я чего то не понимаю?

Кстати, comeau не видит в моем примере никаких ошибок.
getboost.codeplex.com
citylizard.codeplex.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.