【发布时间】:2014-07-27 07:38:49
【问题描述】:
我在看C++ Templates: The Complete Guide,在《13.7 Partial Specialization of Function Templates》作者说:
要重载函数模板,它们的函数参数必须在某些实质性方面有所不同。考虑一个函数模板 R convert(T const&) 其中 R 和 T 是模板参数。我们可能很想为 R = void 专门化这个模板,但这不能使用重载来完成。
可以使用函数模板重载来完成,对吧?如:
#include <iostream>
template <typename T, typename R>
R convert(T const&) { std:: cout << "R convert(T const&)\n"; }
template <typename T>
void convert(T const&) { std:: cout << "void convert(T const&)\n"; }
int main()
{
convert(0);
}
DEMO 这里,结果是:
void 转换(T const&)
作者的真正意思是什么?
【问题讨论】:
-
作者可能指的是C++缺乏对返回类型重载的支持。
-
@nix 但是函数模板重载支持。
-
我认为您遇到了一些 UB,您的编译器不够聪明,无法发出警告。尝试在第一个
convert中添加一个 return 语句(这样它就可以用int i=convert(0)编译), then replace the call toconvert(0)`。它不会编译。 -
编译器无法为第一个模板推导出
R,所以它永远不会被选中。 -
@nix 因为作者在谈论“部分专业化”和“重载”之间的区别,但我认为这也不能通过专业化来完成。所以我无法从书中得到上述上下文的意义。