【问题标题】:STL Vector and template function problemSTL向量和模板函数问题
【发布时间】:2011-02-24 20:24:48
【问题描述】:

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

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

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 的点?

已经谢谢你了。

【问题讨论】:

  • 你的头文件在同一个项目吗?即使它们在同一个解决方案中,您也可能必须从另一个项目中引用一个项目

标签: c++ templates stl vector


【解决方案1】:

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

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

【讨论】:

  • 正是我的问题,感谢您的快速回答。
【解决方案2】:

这个函数是一个模板,所以确保它的定义在头文件中。

返回一个迭代器,std::vector&lt;T&gt;::iterator,而不是一个指针:

return v.begin() + input - 1;

【讨论】:

  • 可能想将r初始化为v.begin()。而且由于它被定义为有一个 vector 迭代器,因此是随机访问的,我可能只是 return v.begin() + (input-1);
猜你喜欢
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
相关资源
最近更新 更多