class template member function explicit specialization definition

最近在写一个小工具,我所掌握的tempalte知识,以及boost,还有一些网络编程模式,最近学的东西都一股脑的给下锅了。
今天使用最近写的一个ini操作模板类,多个cpp引入inicfg.hpp,链接时vs.net2003提示open函数在多个obj中定义。
这可是折磨死我了!下面是解决过程:
看到编译器提示很长的信息,顿时慌了手脚,c++ 中调试template最为苦恼的就是调试信息非常的冗长。
我在此犯了一个错误,没有认真的看链接错误信息!
首先怀疑是inicfg.hpp的头文件是否有#ifndef #define #endif信息,检测没有问题。
然后怀疑是否vs.net2003不支持模板的这种include,但是不可能stl的vector,list等对象都用的好好的。
随后怀疑是否模板具现化中,在两个cpp产生了同样的具现体,导致的错误?用vector进行测试,两个cpp都include vector,
然后定义两个相同的vector对象. a.cpp中 std::vector<int> v1; b.cpp中 std::vector<int> v2。编译,链接都很正常。
因此这个疑虑也排除了。
最后发现是我在inicfg.hpp中使用了class member function explicit specialization definition,类模板成员函数的显示特化,参看<c++ primer>中关于类模板的说明。对于成员函数的特化必须采用这样的形式:

//inicfg.hpp
template <typename strtype>
class inicfg
{
public:
bool open();
}
template <typename strtype>
bool inicfg::open()
{
return false;
}
// 声明一个特化体
template <> bool inicfg<std::string>::open();
//inicfg.cpp
// 定义特化体
template <>
bool inicfg<std::string>::open()
{
//do some op…
return true;
}
将这两个文件添加到工程,编译,链接一切正常!