gcc4 не видит функцию
От: romuld  
Дата: 22.08.08 09:37
Оценка:
Здравствуйте. При попытке перейти на 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) компилируется.
gcc gcc4
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.