Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数模板重载(不同的返回值类型)_C++_Templates - Fatal编程技术网

C++ 函数模板重载(不同的返回值类型)

C++ 函数模板重载(不同的返回值类型),c++,templates,C++,Templates,我正在阅读,在“13.7函数模板的部分专门化”中,作者说: 要重载函数模板,它们的函数参数必须在某些实质性方面有所不同。考虑函数模板R转换(T const &),其中R和T是模板参数。我们可能非常希望将此模板专门化为R=void,但这不能使用重载来完成 可以使用函数模板重载来完成,对吗?例如: #include <iostream> template <typename T, typename R> R convert(T const&) { std:: cou

我正在阅读,在“13.7函数模板的部分专门化”中,作者说:

要重载函数模板,它们的函数参数必须在某些实质性方面有所不同。考虑函数模板R转换(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);
}
#包括
模板

R convert(T const&){std::cout考虑类模板的部分专门化:

template<class U, class V> class T { };

template<class V> class T<void, V> { };
如果你写了
convert(something)
——这以前是格式不正确的,它会转到你的新重载,因为编译器无法推导出第一个模板的
R
。但是如果你写了
convert(something)
甚至
convert(something)
,它仍然会转到原始模板。更糟糕的是,类似于
convert(1)
的内容现在格式不正确,因为它不明确


换句话说,您不能让
convert(something)
使用与
convert(something)不同的实现
,而您可以使用类模板部分专门化来实现这一点。

作者可能是指C++不支持在返回类型上重载。@nix但函数模板重载支持它。我认为您遇到了一些UB,您的编译器没有足够的智能来警告它。请尝试添加一个返回状态我nt到第一个
convert
(这样它将编译
),然后将对
convert(0)`的调用替换为
int i=convert(0)
。它不会编译。编译器无法推断第一个模板的
R
,因此它从未被选中。@nix因为作者正在讨论“部分专门化”和“超载"但是我认为这不能通过专业化来完成。所以我不能从书中得到上述上下文的观点。我认为作者建议函数模板的部分专门化可以做到这一点……我的误解。@宋元耀,C++中没有函数模板的部分专门化,周期。作者似乎是B。e讨论了一些可以通过对标准进行假设性修改以允许函数模板部分专门化来解决的情况,但标准从未以这种方式更改。
template <typename R, typename T>
R convert(T const&) { return /* something */; } 
template <typename T>
void convert(T const&) { }