可能重复:
基于函数返回类型的模板推导?
我试图弄清楚 C++ 模板是如何工作的。例如,我想编写一个简单的数据结构,triple
它的行为类似于 STL ,pair
但包含三个项目。当然,我想使用模板来实现它。从我的角度来看,我正面临着一种奇怪的行为。
首先,我有一个工作示例。这是有效的 C++ 代码:
template<typename T1, typename T2>
T1 getSum(T1 a1, T2 a2) {
return a1 + a2;
}
int main(int argc, int *argv[]) {
long l1 = 1, l2 = 0, l3 = 0, l4 =0;
short s1 = 2, s2 = 0, s3 = 0, s4 = 0;
l2 = getSum(l1, s1);
l3 = getSum(s1, l1);
l4 = getSum(1, 2);
s2 = getSum(l1, s1);
s3 = getSum(s1, l1);
s4 = getSum(1, 2);
cout << l2 << " " << l3 << " " << l4 << endl;
cout << s2 << " " << s3 << " " << s4 << endl;
return 0;
}
这个程序的结果是两行包含3 3 3
每一行。由于我getSum
使用各种参数组合调用函数:(long, short)
and(short, long)
并且每次(integer literal, integer literal)
都将返回值分配给long
andshort
变量,因此我假设编译器知道如何通过返回值进行适当的转换或猜测类型(在整数文字的情况下)每一次。
在这里,我们回到简单的triple
实现。我以几乎相同的方式做所有事情(在我看来),但我得到一个转换错误。这就是我的意思。我的代码如下所示:
template <typename T1, typename T2, typename T3>
struct triple {
T1 first;
T2 second;
T3 third;
};
template <typename T1, typename T2, typename T3>
triple<T1, T2, T3> mt(T1 f, T2 s, T3 t) {
triple<T1, T2, T3> tr;
tr.first = f;
tr.second = s;
tr.third = t;
return tr;
};
int main(int argc, char* argv[]) {
triple<char, char, unsigned short> t = mt(0, 0, 65000);
cout << t.first << " " << t.second << " " << t.third << endl;
return 0;
}
但是,当我尝试编译它时,出现以下错误:
22: error: conversion from 'triple<int, int, int>' to non-scalar type
'triple<char, char, short unsigned int>' requested
(第 22 行是main
函数的第一行)。
毫不奇怪,上述两个triple
s 之间的转换不是编译器的工作。但令我惊讶的是,编译器无法确定由于我想得到函数triple<char, char, short unsigned int>
的结果mt
,因此模板参数应确定为T1 == char
, T2 == char
, T3 == unsigned short
。
而且由于现在事情是这样工作的,我对make_pair
函数的工作方式感到困惑。它的代码看起来很像我的(再次,在我看来)。
所以,我的问题是:请澄清我的代码和工作代码之间的本质区别:)