模板定义和实现不能分开

虽然项目需要,写了半年多的 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++ 代码,如履薄冰。

评论