模板定义和实现不能分开
虽然项目需要,写了半年多的 c++,但是之前一直也没接触过,属于边学边用,很不系统。最近才发现这个可能算是很基本的常识。
如题,类似这样的写法是不行的:
foo.h
foo.cpp
这样做之所以不行,是因为必须要让编译器能够在同一文件中找到模板函数的实现部分,否则会连接错误。
至于原因的细节有很多书或者讨论结果可供参考,这里不再赘述。
解决办法,比较常见的是将所有涉及模板的实现都写在头文件里。据说其他使用到模板函数的文件中将 include 头文件改成直接 include .cpp 文件也是一种办法,我没有作实验,但感觉还不如前者妥当。
c++ 果然是种易学难用的语言,林林总总的历史问题,造成了太过复杂的语法体系。写 c++ 代码,如履薄冰。
如题,类似这样的写法是不行的:
foo.h
template
std::string to_string(T value);
foo.cpp
template
std::string to_string(T value)
{
std::stringstream result;
result << value;
return result.str();
}
这样做之所以不行,是因为必须要让编译器能够在同一文件中找到模板函数的实现部分,否则会连接错误。
至于原因的细节有很多书或者讨论结果可供参考,这里不再赘述。
解决办法,比较常见的是将所有涉及模板的实现都写在头文件里。据说其他使用到模板函数的文件中将 include 头文件改成直接 include .cpp 文件也是一种办法,我没有作实验,但感觉还不如前者妥当。
c++ 果然是种易学难用的语言,林林总总的历史问题,造成了太过复杂的语法体系。写 c++ 代码,如履薄冰。
评论