具有返回类型参数的函数模板特化

时间:2015-11-24 20:02:10

标签: c++ templates template-specialization

是否可以使用返回值的参数来专门化模板。我在尝试执行下面显示的模板特化时遇到错误。所以我目前正在将这两个特化声明为使用宏来避免重复代码的不同函数。

#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.

2 个答案:

答案 0 :(得分:3)

专门的返回类型与任何其他专业化并没有什么不同。问题不在于它是如何工作的,而在于如何调用它。

template<class T1,class T2>
inline T1 func(const T2& a)
{
    return T1(3.5);
}

func(2); //with T2 = int, what is T1?

编译器无法知道返回类型应该是什么。专门化是关于模板参数匹配时如何操作的具体说明,因此它仍然需要首先使用两个模板参数。如果指定第一个模板参数,它将起作用。

func<float>(2); //returns 1.0

如评论中所述,重载比专业化更可取。

float func(const int&);
double func(const float&);

这样,它就不会因为猜测返回类型而停滞不前。

答案 1 :(得分:1)

错误消息告诉您很清楚问题是什么:

  

temp.cpp:4:11:注意:候选模板被忽略:无法推断模板参数'T1'

您必须明确提供模板参数:

int main() {
  func<float,int>(2);  
  return 0;
}

原因是编译器无法推断出您要使用的返回类型。 T2可以从您传递的参数中确定,但对于T1,任何类型都会匹配,因此编译器无法决定。