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
Re: gcc4 не видит функцию
От: Аноним  
Дата: 22.08.08 10:34
Оценка:
Здравствуйте, romuld, Вы писали:

R>Здравствуйте. При попытке перейти на gcc 4 версии всплыли проблемы компиляции. Я сделал маленький тест, который ставит меня в тупик. Вот он:

R>Хорошо, помещаем все F после G — опять работает!
R>Кто то может сказать, что это за прикол такой? Может, баг? Версия компилятора gcc 4.1.2. В предыдущем (gcc 3.4.6) компилируется.
comeau работает также.
Имхо поиск имён. Оно видимо работает примерно также как using namespace X. Если расписать псевдокодом, то будет где-то так: Ищется сначало в обрамляющем скопе, но "перед" точкой инстанцирования, а всё что после как-бы добавляется в неймспейс и делается ему using. Соответственно, using namespace используется только если ничего не найдено в обрамляющем скопе. Где-то так.
Re: gcc4 не видит функцию
От: Lorenzo_LAMAS  
Дата: 22.08.08 12:17
Оценка:
Смотри про двухфазный поиск имен в шаблонах.
Of course, the code must be complete enough to compile and link.
Re: gcc4 не видит функцию
От: Аноним  
Дата: 26.08.08 06:48
Оценка:
Здравствуйте, romuld, Вы писали:

R>Здравствуйте. При попытке перейти на gcc 4 версии всплыли проблемы компиляции. Я сделал маленький тест, который ставит меня в тупик. Вот он:


а в чем тупик? Используется не объявленная заранее функция,
=> ошибка компиляции, что не так?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.