Странности G++?
От: sch  
Дата: 09.10.05 07:16
Оценка:
Есть код:

template<class T>
struct A: public T {
        // считается что some_func_in_T() находится в T
    void f() {
                 some_func_in_T<T>();
    }
};


Сей код G++ компилировать отказывается, но Visual C++ 7.1 и Intel C++ 8.x компилировали без проблем.

mingw32-g++.exe       -I"C:\Program Files\Microsoft DirectX 9.0 SDK (April 2005)\Include" -I"C:\Program Files\msys\include" -I"C:\Program Files\msys\include\c++\3.4.4" -c main.cpp -o main.o
main.cpp: In member function `void A<T>::f()':
main.cpp:7: error: `some_func_in_T' undeclared (first use this function)
main.cpp:7: error: (Each undeclared identifier is reported only once for each function it appears in.)
main.cpp:7: error: expected primary-expression before '>' token
main.cpp:7: error: expected primary-expression before ')' token
Re: Странности G++?
От: Анатолий Широков СССР  
Дата: 09.10.05 07:19
Оценка:
А так?

template<class T>
struct A: public T 
{
    void f() 
    {
                 this->some_func_in_T<T>();
    }
};
Re[2]: Странности G++?
От: sch  
Дата: 09.10.05 07:48
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>А так?


АШ>
АШ>template<class T>
АШ>struct A: public T 
АШ>{
АШ>    void f() 
АШ>    {
АШ>                 this->some_func_in_T<T>();
АШ>    }
АШ>};
АШ>


main.cpp:8: error: expected primary-expression before '>' token
main.cpp:8: error: expected primary-expression before ')' token


Самое странное, что G++ ругается даже если сделать пустой файл, добавить туда только вышеописанный код и
попробовать откомпилировать. Отсюда делаем вывод, что ошибки генерируются до инстанцирования...
Re[3]: Странности G++?
От: sch  
Дата: 09.10.05 08:21
Оценка:
Собственно говоря, порывшись в архивах comp.lang.c++ я нашел. Вот что пишет ставший уже всемирно-известным
через USENET Victor Bazarov:

A template member of a template needs to be specified as such to help
the compiler resolve the name. I don't remember the exact paragraph
of the Standard, but you could search the archives on Google, it has
come up more than once in this newsgroup.

http://groups.google.com/group/comp.lang.c++/browse_thread/thread/a9514f53fcd14921/f5c9f57618b5bbf5

Таким образом надо писать так:

template<class T,class P>
struct A: public T 
{
    void f() 
    {
        T::template some_func_in_T<T>();

        // или

        this->template some_func_in_T<T>();
    }
};
Re[4]: Странности G++?
От: sch  
Дата: 09.10.05 08:29
Оценка: 1 (1)
Кстати, еще одно очень интересное высказывание от Victor Bazarov:

VC++ has got much better over the past couple of years (I consider v7.1
the first really worth using if you want to learn standard C++, v8 is even
better). But it still has some quirks, especially when it comes to being
able to compile non-standard code without even a warning. AFAIK, VC++
team is not going to do much about those "bugs" in their compiler simply
because VC++ successfully compiles the well-formed code. Issuing warnings
or other diagnostics about ill-formed programs is often up to the
implementors. The compiler is free to keep compiling ill-formed code and
generate what it considers to be the best approximation of what the
programmer wanted the code to do. It's non-portable, yes, but it's fully
within the language specifications.


Вот здесь есть интереснаая таблица, содержащая сравнительный анализ реализации шаблонов
в различных компиляторах: http://womble.decadentplace.org.uk/c++/template-faq.html
Re: Странности G++?
От: Dmi_3 Россия  
Дата: 09.10.05 09:59
Оценка:
Здравствуйте, sch, Вы писали:


sch>Есть код:


sch>
sch>template<class T>
sch>struct A: public T {
sch>        // считается что some_func_in_T() находится в T
sch>    void f() {
sch>                 some_func_in_T<T>();
sch>    }
sch>};
sch>


sch>Сей код G++ компилировать отказывается, но Visual C++ 7.1 и Intel C++ 8.x компилировали без проблем.


Прпробуйте

void f() {
  this->template some_func_in_T<T>();
}
Re: Странности G++?
От: MaximE Великобритания  
Дата: 09.10.05 11:49
Оценка:
On Sun, 09 Oct 2005 11:16:53 +0400, sch <38265@users.rsdn.ru> wrote:

> Есть код:

>
>
> template<class T>
> struct A: public T {
>         // считается что some_func_in_T() находится в T
>     void f() {
>                  some_func_in_T<T>();
>     }
> };
>

>
> Сей код G++ компилировать отказывается, но Visual C++ 7.1 и Intel C++ 8.x компилировали без проблем.

Правильно отказывается.

http://rsdn.ru/Forum/?mid=684057&amp;flat=0
Автор: Андрей Тарасевич
Дата: 17.06.04


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[3]: Странности G++?
От: crable США  
Дата: 09.10.05 12:30
Оценка:
Здравствуйте, sch, Вы писали:

sch>Здравствуйте, Анатолий Широков, Вы писали:


АШ>>А так?


АШ>>
АШ>>template<class T>
АШ>>struct A: public T 
АШ>>{
АШ>>    void f() 
АШ>>    {
АШ>>                 this->some_func_in_T<T>();
АШ>>    }
АШ>>};
АШ>>


sch>
sch>main.cpp:8: error: expected primary-expression before '>' token
sch>main.cpp:8: error: expected primary-expression before ')' token
sch>


sch>Самое странное, что G++ ругается даже если сделать пустой файл, добавить туда только вышеописанный код и

sch>попробовать откомпилировать. Отсюда делаем вывод, что ошибки генерируются до инстанцирования...

Правильно, у тебя ошибка, которая проявляется до инстанцирования, нужно писать вот так:
template<class T>
struct A: public T 
{
    void f() 
   {
                 this->template some_func_in_T<T>();
    }
};
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re[2]: Странности G++?
От: _Winnie Россия C++.freerun
Дата: 09.10.05 17:20
Оценка: :))
Здравствуйте, MaximE, Вы писали:


ME>Правильно отказывается.



Интересно, ну вот нафиг нужны эти "->template", typename :/
Только смущают новичков и служат для того, что бы можно было корректно провести синтаксический анализ того, что не нужно.
И так время компиляции для всяких boost.spirit запредельное, а его только увеличивают.
Я лично VC в этом деле поддерживаю. Нефиг тратить время на парсинг того, что не инстанцируется.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[3]: Странности G++?
От: _Winnie Россия C++.freerun
Дата: 09.10.05 18:41
Оценка:
Здравствуйте, _Winnie, Вы писали:


template <class T>
struct _
{
    void f() { Chto hochu, to i pishu. Vot. I ne fig parsit eto }
};


MSVC компилирует на ура.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[4]: Странности G++?
От: _Winnie Россия C++.freerun
Дата: 09.10.05 18:50
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Здравствуйте, _Winnie, Вы писали:



Кстати, замечу, что typename/.template все таки нужны MSVC++ в типах возвращаемых значений/принимаемых значений в шаблонных функциях. Их таки необходимо инстанцировать при поиске подходящих функций. например,
template<class T> 
typename boost::disable_if<boost::is_pointer<T>::value, void>::type
f()
{
}


Но я не все таки не понимаю, зачем. Когда ищем подходящую функцию, при инстанцинации типов параметров/возвращаемых значений все равно все выяснится. А когда идет синтаксичекий разбор, неужели нельзя просто корректно пропустить декларацию функнции?
Можно привести примерчик?
Правильно работающая программа — просто частный случай Undefined Behavior
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.