Здравствуйте. При попытке перейти на gcc 4 версии всплыли проблемы компиляции. Я сделал маленький тест, который ставит меня в тупик. Вот он:
#include <stdio.h>
void F( int* v)
{
if (v) printf("%d", *v);
}
void F( float* v)
{
if (v) printf("%f", *v);
}
void F( double* v)
{
if (v) printf("%f", *v);
}
template <class T>
void G( T * v)
{
if (!v) printf("G: v is null\n");
F(v);
printf("\n");
}
int main(int argc, char**argv)
{
printf("hello world\n");
double a = 3.14;
G(&a);
return 0;
}
Все прекрасно компилится. Здесь
G объявлена после всех
F. Но стоит переместить объявление template-функции
G "между" объявлениями различных вариантов
F, как gcc перестает видеть все, что декларировано после
G.
Например, вот такой вариант уже не компилится:
#include <stdio.h>
void F( int* v)
{
if (v) printf("%d", *v);
}
void F( float* v)
{
if (v) printf("%f", *v);
}
template <class T>
void G( T * v)
{
if (!v) printf("G: v is null\n");
F(v);
printf("\n");
}
void F( double* v)
{
if (v) printf("%f", *v);
}
int main(int argc, char**argv)
{
printf("hello world\n");
double a = 3.14;
G(&a);
return 0;
}
С ошибкой
test.cpp: In function 'void G(T*) [with T = double]':
test.cpp:32: instantiated from here
test.cpp:17: ошибка: нет соответствующей функции для вызова 'F(double*&)'
test.cpp:3: замечание: претенденты: void F(int*)
test.cpp:8: замечание: void F(float*)
Хорошо, помещаем все
F после
G — опять работает!
Кто то может сказать, что это за прикол такой? Может, баг? Версия компилятора
gcc 4.1.2. В предыдущем (
gcc 3.4.6) компилируется.