用到模板时遇到的两个错误
1) 一个是模板函数链接错误
//xxx.h
template <class T>
class A{
public:
T& getT();
private:
T t;
}
//xxx.cpp
template <class T>
T& A<T>::getT(){
return t;
}
链接时报std::string A<std::string>::getT()未定义
参照C++ FAQ [35.12] Why can't I separate the definition of my templates class from its declaration and put it inside a .cpp file
http://www.parashift.com/c++-faq-lite/templates-defn-vs-decl.html
一种解决办法是将实现也放在头文件中,其它办法请参照C++ FAQ [35.13], [35.14]
2) 另一个遇到的问题是模板特化报重复定义
//xxx.h
template<>
inline std::string Stringify(const char* const & str) {
return str;
}
在stackoverflow中找到了答案,需要将模版特化的实现放在cpp文件中,或者加上inline修饰。
//xxx.h
template<>
std::string Stringify(const char* const & str);
//xxx.cpp
template<>
std::string Stringify(const char* const & str) {
return str;
}
或者
//xxx.h
template<>
inline std::string Stringify(const char* const & str) {
return str;
}
这两个问题的解决方法完全相反! 汗