Вопрос: Почему код ниже не работает?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 гарантия; даже для КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ.
Ошибка указывает, что вы пытаетесь передать 'Limb сопз *' в качестве второго параметра, но ваш явный Инстанциация для 'Foo *' в этом месте - это намеренно? –
Не могли бы вы показать нам, где вы на самом деле называете эту функцию? Имея только этот код, то, что вы пытаетесь сделать, довольно непрозрачно. – qdii