具有 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 类型上。