模板特化的编译
在一个头文件中定义一个函数模板:
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++编译器中是通不过的。