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