Создание шаблона для вектора - PullRequest
1 голос
/ 25 августа 2011
#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

Какой смысл мне не хватать?

Ответы [ 4 ]

3 голосов
/ 25 августа 2011

Во-первых, есть лишние скобки:

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

Вы также получаете вторую ошибку, потому что оператор индекса 10 * не определен для int с.Опять же, это та же самая причина, по которой это не сработает:

int j = 21;
cout << j[0];

Обратите внимание, что такую ​​информацию можно почерпнуть из самих ошибок компилятора.Обязательно прочитайте их!

1 голос
/ 25 августа 2011

Ваш полный код со специализацией шаблонов :).Как говорят другие, для «int» нет функции push_back, поэтому для этого вам нужна специализированная реализация.

template &lt typename nameOfTheVariableTypeA,
      typename nameOfTheVariableTypeB &gt
nameOfTheVariableTypeB functionX (nameOfTheVariableTypeA argA,nameOfTheVariableTypeB argB)
{
    nameOfTheVariableTypeA tempArgA;
    nameOfTheVariableTypeB tempArgB;

    argA.push_back(22);

    tempArgA = argA;
    cout &lt&lt "\ntempArgA: " &lt&lt tempArgA[0] &lt&lt "\n";

    /*tempArgB = argB;
    cout &lt&lt "\ntempArgB: " &lt&lt tempArgB &lt&lt "\n";*/

    return tempArgB;
}
template &lt &gt
float functionX &lt int,float &gt (int argA,float argB){

        int tempArgA;
    int tempArgB;

        tempArgA = argA;
    cout &lt&lt "\ntempArgA: " &lt&lt tempArgA &lt&lt "\n";

        return tempArgB;
}


int main ()
{
    functionX &lt int,float &gt(12, 12.4567);

    vector &lt int &gt f;
    functionX &lt vector &lt int &gt , float &gt (f, 12.4567);

    return 0;
}
1 голос
/ 25 августа 2011

При первом вызове functionX:

functionX (12, 12.4567);

Тип nameOfTheVariableTypeA в вашем шаблоне будет выводиться как int.Очевидно, что тип int не поддерживает push_back() или operator[].

1 голос
/ 25 августа 2011

Вызов

functionX (12, 12.4567);

создает функцию с параметрами (int, double)int argA нет ни метода push_back(), ни оператора индекса массива.Поэтому вы также не можете использовать tempArgA[0].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...