G ++ (with -fno-implicit-templates) қайдан үлгіні анықтап алуы керек, егер мен оны нақты анықтай алмасаңыз?

Келесі код жұмыс істейді.

/* 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.

Енді сіздің мысалда сіз типті құрастырып, содан кейін class template анықтамасының ішіндегі анықталған әдістеріне қоңырау шалып, осылайша inline деген сөзбен сәйкес келмейді.

Сіз бұл әрекетті орындауға болады:

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

Содан кейін g ++ -fno-implicit-templates -o test test.cpp файлын құрастырыңыз

1
қосылды