首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

模板特化的编译,该如何处理

2012-02-21 
模板特化的编译在一个头文件中定义一个函数模板:template typenameTypestd::size_tcount(std::vector T

模板特化的编译
在一个头文件中定义一个函数模板:
template <typename   Type>
std::size_t   count(   std::vector <Type>   &tv,   const   Type   &t   )
{
size_t   ret   =   0;
for(   vector <Type> ::iterator   iter   =   tv.begin();   iter   !=   tv.end();   ++iter   )
if(   *iter   ==   t   )
++ret;

return   ret;
}
在另一个文件中定义关于string类型的特化版本:
template <>
std::size_t   count <std::string> (   const   std::vector <std::string>   &svec,   const   std::string   &s   )
{
return   50;
}
编译出错:
d:\program   files\microsoft   visual   studio   8\mywork\mywork\temp\template_spec.h(21)   :   error   C2912:   显式专用化;“size_t   count <std::string> (const   std::vector <_Ty>   &,const   std::string   &)”不是函数模板的专用化
                with
                [
                        _Ty=std::string
                ]

但是去掉特化版本中的模板形参 <std::string> 之后,编译就好了,执行也正常,这是什么原因?

[解决办法]
而去掉特化版本中的“ <std::string> ”,可以通过,可能跟VC推断模板参数的规则有关,个人感觉挺怪异的。而它在GNU g++编译器中是通不过的。

热点排行