Де g ++ (з -fno-implicit-шаблонами) отримує визначені типи шаблонів, якщо я не явно інстанцирую їх?

Наступний код працює.

/* hello.cc */

#include 
#include 

void vec_print()
{
    std::vector is(10, 1);

    for (size_t i = 0; i < is.size(); ++i)
        std::cout << is[i] << " ";
    std::cout << std::endl;
}

/* main.cc */

void vec_print();

int main()
{
    vec_print();
}

Коли я дотримуюсь цього

g++ -fno-implicit-templates -Wall -Wextra -c hello.cc
g++ -fno-implicit-templates -Wall -Wextra -c main.cc
g++ hello.o main.o -o hello

Я не отримую жодних попереджень, і він складається і працює нормально. Я перебуваю під враженням, що це не повинно відбутися. Я використовую gcc 4.4.5.

1

2 Відповіді

Цей параметр не завадить будь-яким інстанціям шаблону, а не лише окремим:

-фно-неявні шаблони   Ніколи не випускати код не вбудованих шаблонів, які неявно створюються (тобто використовуються); лише видає код для явних інстанцирувань. Для отримання додаткової інформації див. Інсталяція шаблону.

Компілятор вказує всі функції-члени vector , що використовуються у вашому коді, тому компіляція виконується успішно.

Наступна помилка буде завершена при складанні з цією опцією, оскільки для цього потрібен не вбудований екземпляр:

#include 

int main()
{
    auto f = &std::vector::resize;
}
6
додано
Удар мені до цього, +1
додано Автор David Rodríguez - dribeas, джерело

Згідно з повідомленням:

   -fno-implicit-templates
       Never emit code for non-inline templates which are instantiated implicitly (i.e. by use); only emit code for explicit instantiations.

Тепер у вашому прикладі ви вказуєте тип, а потім викликаєте методи, які визначено усередині визначення шаблону класу і, таким чином, неявно inline .

Ви можете спробувати це:

template 
void noop( T const & ) {}
int main() {
   noop(1);
}

Потім скомпілюйте з g ++ -fno-implicit-templates -o test test.cpp

1
додано
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147