STL, GCC и явная реализация шаблона - PullRequest
0 голосов
/ 01 марта 2012

Вопрос: почему приведенный ниже код не работает?

Я хочу использовать явную реализацию шаблона для моего проекта.Тем не менее, когда я пытаюсь создать стандартный алгоритм (std::find), мне кажется, что мне также нужно создать какую-то внутреннюю процедуру.Он говорит:

undifined reference to Foo* std::__find<Foo const*, unsigned int>(Foo const*, 
    Foo const*, unsigned int const&, std::random_access_iterator_tag)

, когда я

template
Foo* std::find<Foo*,unsigned int>(Foo*,Foo*,const unsigned int&);

Точнее, я пытаюсь сделать следующее:

#include <algorithm>
#include <cstdio>

class Foo
    {
    public:
        unsigned int id;
        bool operator==(unsigned int b)
            {return id==b;}
};


template
Foo* std::find<Foo*,unsigned int>(Foo*,Foo*,const unsigned int&);

int main()
    {
    Foo bar[4]={1,2,3,4};
    Foo* p_bar=std::find(bar,bar+4,3);
    printf("%p    %u\n",p_bar,*p_bar);
    return 0;
    }

И он компилируется с использованием

g++ -fno-explicit-templates test.cpp

для принудительной явной реализации шаблона.

Вывод компилятора выглядит следующим образом:

ccWFduTJ.o:test.cpp:(.text$_ZSt4findIP3FoojET_S2_S2_RKT0_[Foo* std::find<Foo*, unsigned int>(Foo*, Foo*, unsigned int const&)]+0x2a): undefined reference to `Foo* std::__find<Foo*, unsigned int>(Foo*, Foo*, unsigned int const&, std::random_access_iterator_tag)'
ccWFduTJ.o:test.cpp:(.text$_ZSt4findIP3FooiET_S2_S2_RKT0_[Foo* std::find<Foo*, int>(Foo*, Foo*, int const&)]+0x2a): undefined reference to `Foo* std::__find<Foo*, int>(Foo*, Foo*, int const&, std::random_access_iterator_tag)'
collect2: ld returned 1 exit status

Если это поможет, вот что выводит g ++ --version:

g ++ (tdm-1) 4.5.2

Copyright (C) 2010 Free Software Foundation, Inc.

Это свободное программное обеспечение;см. источник для условий копирования.Там нет гарантии;даже не для ИЗДЕЛИИ или ФИТНЕСА ДЛЯ ОСОБЕННОЙ ЦЕЛИ.

1 Ответ

0 голосов
/ 01 марта 2012

Как быстрый тест, эта сборка для меня:

#include <algorithm>

using namespace std;

class Foo
{
};

template<>
Foo* std::find<Foo*, unsigned int>(Foo*, Foo*, const unsigned int& )
{
    return NULL;
}

int main( int argc, char *argv )
{
    return 0;
}
...