STL Вектор и проблема функции шаблона - PullRequest
3 голосов
/ 24 февраля 2011

Я хотел бы сделать функцию, которая манипулирует вектором, чтобы выбрать один и вернуть его.(Лучше всего вернуть итератор, который указывает на этот выбор.)

Хорошо, у меня есть этот код в моем заголовке:

class Ecran { // That means Screen in french :P
    // Other definitions...

    template<typename T>
    static T* SelectFrom(vector<T> & v);
}

Реализация:

template <class T>
T* Ecran::SelectFrom(vector<T> &v){
    int max = v.size();
    cout << "Veuillez selectionner un objet parmis les suivants:" << endl << endl;

    cout << "0) Aucun" << endl;
    for (int i = 1; i <= max; i++){
        cout << i << ") " << v[i-1] << endl;
    }

    bool isValid = false;
    string raw;
    int input;
    while (!isValid){
       raw = GetWord();
       input = atoi(raw.c_str());
       if( (input >= 0) && (input <= max)){
           isValid = true;
       }
    }
    if (input == 0){
        return 0;
    }
    return & (v[input -1]);
}

Итак, вот в чем проблема: когда я его использую, компилятор сообщает мне, что:

неопределенная ссылка на `Club * Ecran :: SelectFrom (std :: vector> &)

Я использую это так:

Club * toDel = Ecran::SelectFrom(_clubs);

Вот и все, любая помощь будет принята с благодарностью.Кроме того, был бы способ сделать это, но возвращает итератор вместо точки к T?

Спасибо.

Ответы [ 2 ]

10 голосов
/ 24 февраля 2011

Проблема, которую вы получаете, это ошибка компоновщика, и если бы мне пришлось угадывать, я бы предположил, что ваша проблема в том, что вы разбили свою реализацию на пару .h / .cpp.Для обычных классов C ++ это правильный подход, но при работе с шаблонами вы должны поместить весь код, включая реализацию, в файл заголовка.

Причина этого связана с компиляцией C ++и связь модели и как она играет с шаблонами.С обычным классом компилятор может генерировать код для каждого файла .cpp отдельно, а затем связывать весь код вместе для разрешения внешних ссылок.Проблема этого подхода применительно к шаблонам заключается в том, что шаблоны не являются кодом;это шаблоны для кода, и когда вы компилируете сам шаблон, код не генерируется.Код для шаблонов генерируется только тогда, когда создается экземпляр шаблона, и когда это происходит, код, который должен быть создан, должен быть видимым.Следовательно, если вы скомпилируете файл .cpp, содержащий реализацию класса шаблона, то компилятор не сможет увидеть этот код, когда шаблон фактически используется, и, следовательно, не будет генерировать какие-либо экземпляры этого кода, следовательно, ошибка компоновщика.

4 голосов
/ 24 февраля 2011

Эта функция является шаблоном, поэтому убедитесь, что ее определение находится в заголовочном файле.

Для возврата итератора, std::vector<T>::iterator вместо указателя:

return v.begin() + input - 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...