版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

仓库源文站点原文

有一天你想对容器重载运算符, 但是却出现了神秘问题

<!-- more -->

在日复一日地对容器书写

{% icodeweb blog lang:cpp draft-021/for.cpp %}

后, 你终于受不了了, 于是你决定写一个重载来一劳永逸地解决这个问题

{% icodeweb blog lang:cpp draft-021/overload.cpp %}

一切看起来都是那么美好, 直到你尝试输出一个字符串. 在你输出字符串时, 编译器拒绝了你的代码, 并说你的重载和

{% icodeweb blog lang:cpp draft-021/sign.cpp %}

撞车了

为什么会这样呢? 答案在于部分模板特化的 匹配规则, 简单来说, 编译器不能确定你的重载和 <string> 里的重载哪个更特殊, 画成 Hasse 图是这样的:

注意到你的 <font color=blue>重载</font> 和 <string> 里的 <font color=red>重载</font> 是不可比的, 所以在匹配时无法决定哪个优先级更高

因此正确的写法应该是这样:

{% icodeweb blog lang:cpp draft-021/overload2.cpp %}

参考资料