c++ - STL Vector和模板函数问题

标签 c++ templates stl vector

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

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

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

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

undefined reference to `Club* Ecran::SelectFrom(std::vector >&)

我是这样使用它的:

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

就是这样,任何帮助将不胜感激。此外,是否有一种方法可以做到这一点,但返回一个迭代器而不是指向 T 的点?

已经谢谢你了。

最佳答案

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

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

关于c++ - STL Vector和模板函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5110000/

相关文章:

c++ - 如何用 C++ 从 MySQL 获取 Blob 数据

C++ 将修改后的 MySQL 时间戳存储为字符串

c++ - 如何实例化类的公共(public)成员并将其作为 std::promise 返回?

c++ - 如果 T 不是默认可构造的,如何优雅地初始化 std::array<T, n>?

c++ - 从结构中获取所有可变参数模板类型,该结构是函数模板中的类型参数

c++ - OpenMP STL 集容器迭代器

c++ - 为什么 VS 编译器会在对象内存中插入一个 NULL

c++ - 检查嵌套的标准库数据

c++ - 等效于 std::map 的 remove_if

templates - <h2> 和 img 在一行中