c – 为什么模板专业化不能改变返回类型?

阅读 this question之后,我不得不再次意识到我对模板的了解程度.我可以理解,这样的模板专业化

// A
template <typename T> void foo(T x){}
template <> void foo<double>(int x){}

无法正常工作(错误:模板ID’foo< double>‘代表’void foo(int)’与任何模板声明都不匹配).它不仅没有意义,而且参数推断也没有机会得到正确的T.但是,我不明白为什么它对返回类型不起作用:

// B
template <typename T> int foo(T x){}  
template <> double foo<double>(double x){}

(与上面类似的错误).实际上我手头没有任何特定的用例,但我仍然会对如何根据T选择返回类型感兴趣.作为一种解决方法,我发现了这个:

// C 
template <typename T> struct foo { static int moo(T x){return x;} };
template <> struct foo<double> { static double moo(double x){return x;} };

因此可以选择依赖于T的返回类型.但是,我仍然感到困惑……

B不可能的原因是什么?

解决方法

即使很奇怪,你也可能有

template <typename T>
void foo(int);

template <typename T>
char foo(int);

Demo

所以你的专业化将是模棱两可的.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...