Интересно, ну вот нафиг нужны эти "->template", typename :/
Только смущают новичков и служат для того, что бы можно было корректно провести синтаксический анализ того, что не нужно.
И так время компиляции для всяких boost.spirit запредельное, а его только увеличивают.
Я лично VC в этом деле поддерживаю. Нефиг тратить время на парсинг того, что не инстанцируется.
Правильно работающая программа — просто частный случай Undefined Behavior
Кстати, еще одно очень интересное высказывание от 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.
template<class T>
struct A: public T {
// считается что some_func_in_T() находится в Tvoid 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
Здравствуйте, Анатолий Широков, Вы писали:
АШ>А так?
АШ>
АШ>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++ ругается даже если сделать пустой файл, добавить туда только вышеописанный код и
попробовать откомпилировать. Отсюда делаем вывод, что ошибки генерируются до инстанцирования...
Собственно говоря, порывшись в архивах 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.
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 компилировали без проблем.
Здравствуйте, 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.
Здравствуйте, _Winnie, Вы писали:
_W>Здравствуйте, _Winnie, Вы писали:
Кстати, замечу, что typename/.template все таки нужны MSVC++ в типах возвращаемых значений/принимаемых значений в шаблонных функциях. Их таки необходимо инстанцировать при поиске подходящих функций. например,
Но я не все таки не понимаю, зачем. Когда ищем подходящую функцию, при инстанцинации типов параметров/возвращаемых значений все равно все выяснится. А когда идет синтаксичекий разбор, неужели нельзя просто корректно пропустить декларацию функнции?
Можно привести примерчик?
Правильно работающая программа — просто частный случай Undefined Behavior