#include <iostream>
#include <vector>
using namespace std;
template <typename nameOfTheVariableTypeA,
typename nameOfTheVariableTypeB> nameOfTheVariableTypeB functionX
(nameOfTheVariableTypeA argA,
(nameOfTheVariableTypeB argB)
{
nameOfTheVariableTypeA tempArgA;
nameOfTheVariableTypeB tempArgB;
argA.push_back(22);
tempArgA = argA;
cout << "\ntempArgA: " << tempArgA[0] << "\n";
tempArgB = argB;
cout << "\ntempArgB: " << tempArgB << "\n";
return tempArgB;
}
int main ()
{
functionX (12, 12.4567);
vector <int> f;
functionX (f, 12.4567);
return 0;
}
从模板书中:
An attempt to instantiate a template for a type that doesn't support all the operations used within it will result in a compile-time error.
我收到的上述代码错误是:
error: request for member ‘push_back’ in ‘argA’, which is of non-class type ‘int’
error: subscripted value is neither array nor pointer
我错过了什么意思?
答案 0 :(得分:3)
首先,有一个多余的括号:
template <typename nameOfTheVariableTypeA,
typename nameOfTheVariableTypeB> nameOfTheVariableTypeB functionX
(nameOfTheVariableTypeA argA,
/*(*/nameOfTheVariableTypeB argB)
// Note: extra parenthesis not needed here -----^
{
假设这只是一个错字,让我们来看看对functionX()
的第一次打电话:
functionX(12, 12.4567);
现在,模板函数要求在调用它们之前指定所有模板参数。但在某些情况下,编译器可以推导出nameOfTheVariableTypeA
和nameOfTheVariableTypeB
所需的类型,以使函数调用起作用。
在这种情况下,12
是一个整数文字,因此它的类型为int
。 12.4567
是一个浮点字面值,因此它的类型为double
。因此,在functionX()
内,nameOfTheVariableTypeA
的类型为int
,而nameOfTheVariableTypeB
的类型为double
。
现在已经指定了所有模板参数(在这种情况下,推导出),编译器可以实例化模板函数。也就是说,编译器会创建一个如下所示的函数:
// Hypothetical function generated by the compiler
double functionX_int_double(int argA, double argB)
{
int tempArgA;
double tempArgB;
// ...
就好像编译器只是用推导出的类型替换nameOfTheVariableTypeA
和nameOfTheVariableTypeB
。显然,参数argA
和变量tempArgA
的类型为int
。您收到第一个错误,因为int
没有名为push_back()
的类成员函数。这也是为什么不起作用的原因:
int i = 20;
i.push_back(22);
您还会收到第二个错误,因为没有为[]
定义下标运算符int
。同样,这也是为什么这不起作用的原因:
int j = 21;
cout << j[0];
请注意,可以从编译器错误本身收集此类信息。请务必阅读它们!
答案 1 :(得分:1)
电话
functionX (12, 12.4567);
使用(int, double)
参数实例化一个函数。 int argA
既没有push_back()
方法也没有数组索引运算符。所以你也不能使用tempArgA[0]
。
答案 2 :(得分:1)
第一次致电functionX
:
functionX (12, 12.4567);
模板中的nameOfTheVariableTypeA
类型将推断为int
。显然,int
类型不支持push_back()
或operator[]
。
答案 3 :(得分:1)
使用模板专业化的完整代码:)。正如其他人所说,“int”没有push_back函数,因此你需要专门的实现。
template < typename nameOfTheVariableTypeA, typename nameOfTheVariableTypeB > nameOfTheVariableTypeB functionX (nameOfTheVariableTypeA argA,nameOfTheVariableTypeB argB) { nameOfTheVariableTypeA tempArgA; nameOfTheVariableTypeB tempArgB; argA.push_back(22); tempArgA = argA; cout << "\ntempArgA: " << tempArgA[0] << "\n"; /*tempArgB = argB; cout << "\ntempArgB: " << tempArgB << "\n";*/ return tempArgB; } template < > float functionX < int,float > (int argA,float argB){ int tempArgA; int tempArgB; tempArgA = argA; cout << "\ntempArgA: " << tempArgA << "\n"; return tempArgB; } int main () { functionX < int,float >(12, 12.4567); vector < int > f; functionX < vector < int > , float > (f, 12.4567); return 0; }