你觉得接口实作分开是为了什么?把东西放在标头档再分离编译的情况, 对不同的 translation unit 来说, 引入的多份型别/模板/物件彼此其实是不一样的; 但因为要保证 ODR 所以它们被视为是相同的实体. 即使模板也可以细分有无特化/具现化, 一般最简单的使用通常都是无特化再透过 implicit instantiation 来自动产生实作, 因为要完整的程式码才有办法做的这件事, 所以才会有模板实作都要写在标头档的错觉.事实上模板也可以写成像你说的一样: 接口/实作分离,但要很明白你的目的, 因为这种写法很容易违反 ODR.先明白 include 只是复制贴上, 那再来从 ODR 的角度思考为什么有的东西可以放在标头档里其他的却会造成连结错误, 再来想想这样分开写到底有什么好处. 如果今天我分开写没办法得到上述的好处, 也不会造成连结错误的话, 当然全写在标头档里比较方便囉 (节省同步的成本).开发软件最经常遇到的就是改变, 最害怕的也是改变.开发上分成两个角色: library user & developer. user 因为只是不需要知道细节, 所以有一份标头档和已经编好的函式库档就可以做开发, developer 有任何改动,如果不是改在标头档内, 所以 user 所需要做的最多就是重新连结而已. 接口/实作分离一方面就是要避免 user 重复做编译的动作 (编译防火墙), 如果函式库含有商业机密通常也会这样做 (看授权) 所以撰码的时候身分需要持续切换, 作为 developer 时就要思考怎样让 user 减少编译次数, 在接口上做最少改动; 作为 user 的时候思考接口设计是否方便合理.简单说如果一个实作万年不变, 而且没有需要/可能减少编译次数/时间的考量, 就会直接写在标头档里.以 ISO 标准教学流程 [P1389R1] 来说这个应该归在最后的工具介绍阶段里, 对语言特性更了解后才比较清楚该怎么拿捏. 只是为了教学方便很容易跳过这些基础知识, 不过关键字: ODR 可以先深入学习.