STL,GCC和显式模板实例化

时间:2012-03-01 09:59:16

标签: c++ templates gcc stl

问题:为什么下面的代码不起作用?

我想为我的项目使用显式模板实例化。但是,当我尝试实例化标准算法(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

     

版权所有(C)2010 Free Software Foundation,Inc。

     

这是免费软件;查看复制条件的来源。没有   保证;甚至不适用于适销性或特定用途的适用性。

1 个答案:

答案 0 :(得分: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;
}