实例化矢量的模板

时间:2011-08-25 05:21:36

标签: c++ templates vector

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

我收到的上述代码错误是:

  1. error: request for member ‘push_back’ in ‘argA’, which is of non-class type ‘int’

  2. error: subscripted value is neither array nor pointer

  3. 我错过了什么意思?

4 个答案:

答案 0 :(得分:3)

首先,有一个多余的括号:

template <typename nameOfTheVariableTypeA,  
      typename nameOfTheVariableTypeB> nameOfTheVariableTypeB functionX  
                                               (nameOfTheVariableTypeA argA, 
                                              /*(*/nameOfTheVariableTypeB argB) 
// Note: extra parenthesis not needed here -----^ 
{

假设这只是一个错字,让我们来看看对functionX()的第一次打电话:

functionX(12, 12.4567);  

现在,模板函数要求在调用它们之前指定所有模板参数。但在某些情况下,编译器可以推导出nameOfTheVariableTypeAnameOfTheVariableTypeB所需的类型,以使函数调用起作用。

在这种情况下,12是一个整数文字,因此它的类型为int12.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;  
    // ...

就好像编译器只是用推导出的类型替换nameOfTheVariableTypeAnameOfTheVariableTypeB。显然,参数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;
}