具有 return 类型参数的函数模板特化
function template specialization with return type argument
是否可以使用 return 值的参数来专门化模板。我在尝试进行如下所示的模板专业化时遇到错误。所以我目前将这两个专业声明为使用宏的不同函数来'avoid'复制代码。
#include <iostream>
template<class T1,class T2>
inline T1 func(const T2& a) { return T1(3.5);}
template<>
inline float func(const int& a) { return (1.0); }
template<>
inline double func(const float& a) {return (2.0); }
int main() {
func(2);
return 0;
}
错误是:
temp.cpp:13:3: error: no matching function for call to 'func'
func(2);
^~~~
temp.cpp:4:11: note: candidate template ignored: couldn't infer template argument 'T1'
inline T1 func(const T2& a) { return T1(3.5);}
^
1 error generated.
错误信息告诉你很清楚是什么问题:
temp.cpp:4:11: note: candidate template ignored: couldn't infer template argument 'T1'
您必须明确提供模板参数:
int main() {
func<float,int>(2);
return 0;
}
原因是编译器无法推断出您要使用的 return 类型。 T2
可以根据您传递的参数确定,但是对于 T1
任何类型都会匹配,因此编译器无法决定。
return 类型的专业化与任何其他专业化并没有什么不同。问题不在于它是如何工作的,而在于它是如何被调用的。
template<class T1,class T2>
inline T1 func(const T2& a)
{
return T1(3.5);
}
func(2); //with T2 = int, what is T1?
编译器无法知道 return 类型应该是什么。特化是关于模板参数匹配时要做什么的具体说明,因此它仍然首先需要两个模板参数。如果您指定第一个模板参数,它将起作用。
func<float>(2); //returns 1.0
不过,如评论中所述,重载优于专门化。
float func(const int&);
double func(const float&);
这样,它就不会卡在猜测 return 类型上。
是否可以使用 return 值的参数来专门化模板。我在尝试进行如下所示的模板专业化时遇到错误。所以我目前将这两个专业声明为使用宏的不同函数来'avoid'复制代码。
#include <iostream>
template<class T1,class T2>
inline T1 func(const T2& a) { return T1(3.5);}
template<>
inline float func(const int& a) { return (1.0); }
template<>
inline double func(const float& a) {return (2.0); }
int main() {
func(2);
return 0;
}
错误是:
temp.cpp:13:3: error: no matching function for call to 'func'
func(2);
^~~~
temp.cpp:4:11: note: candidate template ignored: couldn't infer template argument 'T1'
inline T1 func(const T2& a) { return T1(3.5);}
^
1 error generated.
错误信息告诉你很清楚是什么问题:
temp.cpp:4:11: note: candidate template ignored: couldn't infer template argument 'T1'
您必须明确提供模板参数:
int main() {
func<float,int>(2);
return 0;
}
原因是编译器无法推断出您要使用的 return 类型。 T2
可以根据您传递的参数确定,但是对于 T1
任何类型都会匹配,因此编译器无法决定。
return 类型的专业化与任何其他专业化并没有什么不同。问题不在于它是如何工作的,而在于它是如何被调用的。
template<class T1,class T2>
inline T1 func(const T2& a)
{
return T1(3.5);
}
func(2); //with T2 = int, what is T1?
编译器无法知道 return 类型应该是什么。特化是关于模板参数匹配时要做什么的具体说明,因此它仍然首先需要两个模板参数。如果您指定第一个模板参数,它将起作用。
func<float>(2); //returns 1.0
不过,如评论中所述,重载优于专门化。
float func(const int&);
double func(const float&);
这样,它就不会卡在猜测 return 类型上。