2012-03-01 2 views
0

Вопрос: Почему код ниже не работает?STL, GCC и явное создание шаблона

Я хочу использовать явное создание шаблона для моего проекта. Однако, когда я пытаюсь создать стандартный алгоритм (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&); 

Больше precicly, я пытаюсь сделать следующее:

#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 

Если это помогает, вот что г ++ --version выходы:

г ++ (ТДМ-1) 4.5.2

Copyright (C) 2010 Free Software Foundation, Inc.

Это бесплатное программное обеспечение; см. источник условий копирования. Существует NO гарантия; даже для КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ.

+5

Ошибка указывает, что вы пытаетесь передать 'Limb сопз *' в качестве второго параметра, но ваш явный Инстанциация для 'Foo *' в этом месте - это намеренно? –

+0

Не могли бы вы показать нам, где вы на самом деле называете эту функцию? Имея только этот код, то, что вы пытаетесь сделать, довольно непрозрачно. – qdii

ответ

0

Подобно тому, как быстро испытание, это создает для меня:

#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; 
} 
+1

Это специализация, а не явная инстанция. – user877329

Смежные вопросы