STL向量和模板功能问题

Mic*_*ron 3 c++ templates stl vector

我想做一个操作向量的函数,以便选择一个,并返回它.(最好的方法是返回指向该选择的迭代器.)

好吧,我的标题中有这个代码:

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

    template<typename T>
    static T* SelectFrom(vector<T> & v);
}
Run Code Online (Sandbox Code Playgroud)

实施:

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]);
}
Run Code Online (Sandbox Code Playgroud)

所以,问题在于:当我使用它时,编译器告诉我:

未定义引用`Club*Ecran :: SelectFrom(std :: vector>&)

我这样用它:

Club * toDel = Ecran::SelectFrom(_clubs);
Run Code Online (Sandbox Code Playgroud)

就是这样,任何帮助都将非常感激.那么,有没有办法做到这一点但返回迭代器而不是指向T?

谢谢你.

tem*_*def 10

您遇到的问题是链接器错误,如果我不得不猜测我会认为您的问题是您将实现拆分为.h/.cpp对.对于常规C++类,这是正确的方法,但在处理模板时,必须将所有代码(包括实现)放入头文件中.

其原因与C++编译和链接模型以及它如何与模板一起使用有关.使用常规类,编译器可以单独为每个.cpp文件生成代码,然后将所有代码链接在一起以解析外部链接.但是,这种方法应用于模板的问题是模板不是代码; 它们是代码的模式,当您编译实际模板本身时,不会生成任何代码.模板代码仅在实例化模板时生成,并且当发生这种情况时,要实例化的代码必须是可见的.因此,如果编译包含模板类实现的.cpp文件,则编译器在实际使用模板时将无法看到该代码,因此不会生成该代码的任何实例化,因此链接器错误.