与字符串(GCC)一起使用时对函数模板的未定义引用 我需要在C++中编写一个模板函数:代码> RePosieAuth/Ung>,它将采用字符串、WString、GLYBMM::WISing等,并在主题>代码>代码> >替换< /代码>中替换所有出现的搜索 .

与字符串(GCC)一起使用时对函数模板的未定义引用 我需要在C++中编写一个模板函数:代码> RePosieAuth/Ung>,它将采用字符串、WString、GLYBMM::WISing等,并在主题>代码>代码> >替换< /代码>中替换所有出现的搜索 .,c++,string,templates,gcc,stl,C++,String,Templates,Gcc,Stl,替换_all.cc template < class T > T replace_all( T const &search, T const &replace, T const &subject ) { T result; typename T::size_type done = 0; typename T::size_type pos; whil

替换_all.cc

template < class T >
T replace_all(
        T const &search,
        T const &replace,
        T const &subject
) {
        T result;

        typename T::size_type done = 0;
        typename T::size_type pos;
        while ((pos = subject.find(search, done)) != T::npos) {
                result.append (subject, done, pos - done);
                result.append (replace);
                done = pos + search.size ();
        }
        result.append(subject, done, subject.max_size());
        return result;
}
我得到:

test.o: In function `main':
test.cc:(.text+0x13b): undefined reference to `
   std::basic_string<char, std::char_traits<char>, std::allocator<char> >
   replace_all< std::basic_string<char, std::char_traits<char>, std::allocator<char> > >(
       std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&,
       std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&,
       std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&
   )
'
collect2: ld returned 1 exit status
程序链接并产生预期输出:

damn bar fee boor damn bardamn b

为什么链接会失败?我可以做些什么使其工作?

编译器需要在实例化点查看模板定义,否则无法生成为您实例化模板所用的类型专门化的代码。正确的方法是像您那样放置模板函数的实现。

您不能链接模板,因为在有人尝试使用(实例化)模板之前,编译器不知道要生成哪些代码

如果您知道要使用哪些类型,或者知道它们是有限的,则可以“要求”编译器实例化模板。
如果需要,请将其放入.cc文件:

template std::string replace_all( std::string const& search,
                                  std::string const& replace,
                                  std::string const& subject );


template glibmm::ustring replace_all( glibmm::ustring const& search,
                                      glibmm::ustring const& replace,
                                      glibmm::ustring const& subject );
g++ -W -Wall test.cc
damn bar fee boor damn bardamn b
template std::string replace_all( std::string const& search,
                                  std::string const& replace,
                                  std::string const& subject );


template glibmm::ustring replace_all( glibmm::ustring const& search,
                                      glibmm::ustring const& replace,
                                      glibmm::ustring const& subject );