2015-11-24 128 views
1

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

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

你会得到什么错误? – user463035818

+1

为什么不只是一个超负荷? – AndyG

+1

[无法重现](http://coliru.stacked-crooked.com/a/fbdd4603f59a6613)。 –

回答

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&); 

这样,它不会卡住猜测返回类型。

+0

谢谢,帮助为什么我不能使用模板专门化,因为我在表达式模板中使用它,我无法给它返回类型参数。正如你在评论中所说的那样,T2被计算出来,但不是返回类型T1。重载解决方案是我目前使用的宏,我将继续使用它。 – user1382302

1

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

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

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

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

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

+0

这不是重点。我通过给它一个int func(2)来指定模板参数,它应该选择int版本。 func(2.0f)应该选择其他。重载版本正确但没有专业化。这是为什么?这是我想知道的。 – user1382302

+0

@ user1382302为什么我不知道,但多数民众赞成在错误说:无法推断模板参数。通常这可以通过陈述参数来解决。 – user463035818

+0

@ user1382302以及您的意思是“那不是重点”。 ?当你像我建议的那样做时,错误消失了([刚试过](https://ideone.com/DVPJZ1)) – user463035818