如果我不在函数参数列表中使用模板参数(类型)->仅作为返回类型,则不会有任何推论:
template <typename T>
T zero() { return 0; }
int main()
{
int x = zero();
}
gives:
a.cpp:15:18: error: no matching function for call to ‘zero()’
int x = zero();
^
a.cpp:11:3: note: candidate: ‘template<class T> T zero()’
T zero() { return 0; }
^~~~
a.cpp:11:3: note: template argument deduction/substitution failed:
a.cpp:15:18: note: couldn't deduce template parameter ‘T’
int x = zero();
编译的唯一方法是在尖括号中指定模板类型:
template <typename T>
T zero() { return 0; }
int main()
{
int x = zero<int>();
}
-
所以我的问题是,为什么 g++can从中推导出类型参数列表模板函数,但是cannot从中推断出返回类型(编译器编译时也知道main
,所以它知道类型)。
-
当模板函数在其参数列表中使用模板类型时,为模板函数提供尖括号中的类型是任意的(因为推导)?因此,作为一个好的实践,我是否应该始终在大括号中提供类型,无论函数如何声明?
第二个问题不太可读。用简单的话来说 -> 我应该使用foo<T>(arg, ...)
(提供类型)每次,无论函数声明如何?即使编译器可以推断出它,但我还是会提供类型以进行良好的实践?
一般来说,不可能根据函数的返回类型来推断函数。但是如果您使用自动类型转换 C++ 功能,那么您可以实现您所需要的:
template <typename T>
T zero() { return 1; }
template <>
float zero<float>() { return 3.0f; }
struct Zero
{
template<typename T>
operator T()
{
return zero<T>();
}
};
int main()
{
int x = Zero();
float y = Zero();
return x + y;
}
首先创建临时对象 Zero(),在分配期间我们使用转换运算符来执行零模板函数的正确特化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)