2011-02-24 101 views
3

我想做一個函數來操縱一個向量來選擇一個並返回它。 (最好是返回一個指向該選擇的迭代器)STL向量和模板函數問題

好吧,我在這裏有這樣的代碼在我的頭:

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 * Ecr一個:: SelectFrom(標準::矢量> &)

我用它這樣的:

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

就是這樣,任何幫助將不勝感激。此外,有沒有辦法做到這一點,但返回一個迭代器,而不是指向T?

謝謝。

+0

你的頭文件在同一個項目中嗎?即使它們處於相同的解決方案中,也可能需要引用另一個項目 – clamchoda 2011-02-24 20:31:12

回答

10

你得到的問題是鏈接錯誤,如果我猜我會假設你的問題是,你」將你的實現分解成一個.h/.cpp對。對於常規的C++類,這是正確的方法,但是在處理模板時,必須將所有代碼(包括實現)放入頭文件中。

其原因與C++編譯和鏈接模型以及它如何使用模板有關。使用常規類時,編譯器可以分別爲每個.cpp文件生成代碼,然後將所有代碼鏈接在一起以解析外部鏈接。雖然這種方法應用於模板的問題是模板不是代碼;它們是代碼模式,當您編譯實際模板本身時,不會生成代碼。模板代碼僅在實例化模板時生成,發生這種情況時,要實例化的代碼必須可見。因此,如果您編譯包含模板類實現的.cpp文件,那麼編譯器將無法在模板實際使用時看到該代碼,因此不會生成該代碼的任何實例,因此鏈接器錯誤。

+0

正是我的問題是,謝謝你的快速答案。 – 2011-03-14 19:31:38

4

這個函數是一個模板,所以確保它的定義在頭文件中。

對於返回一個迭代器,std::vector<T>::iterator,而不是一個指針:

return v.begin() + input - 1; 
+0

可能需要將'r'初始化爲'v.begin()'。因爲它被定義爲一個* vector *迭代器,因此是隨機訪問,我可能只是'返回v.begin()+(input-1);' – 2011-02-24 20:55:13

+0

@SteveJessop是的。 :-S – wilhelmtell 2011-02-25 00:29:41