ShiftVector模板类 - '找不到符号'

时间:2016-02-23 18:39:20

标签: c++ templates vector

我创建了一个专门用于旋转矢量的类。 (我意识到这个功能基本上已经存在于STL中,我只是试图处理模板类。)

我的规范文件:

template <class T>
class ShiftVec {
private:
    vector<T> vec;

public:
    ShiftVec(vector<T>);
    vector<T> getVec();
    void shiftRight(int);
    void shiftLeft(int);
};

我的实施档案:

template <class T>
ShiftVec<T>::ShiftVec(vector<T> v) {
    vec = v;
}

template <class T>
vector<T> ShiftVec<T>::getVec() {
    return vec;
}

template <class T>
void ShiftVec<T>::shiftRight(int n) {
    rotate(vec.begin(),
           vec.end()-n, // this will be the new first element

template class ShiftVec<int>;
template class ShiftVec<double>;
template class ShiftVec<bool>;
template class ShiftVec<string>;

当我运行这个时,我得到一堆看起来像这样的错误:

Undefined symbols for architecture x86_64:
  "ShiftVec<int>::shiftRight(int)", referenced from:
      _main in main.o
  "ShiftVec<int>::getVec()", referenced from:
      _main in main.o
  "ShiftVec<int>::ShiftVec(std::__1::vector<int, std::__1::allocator<int> >)", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我不确定这里到底出了什么问题。向正确的方向推进会很有帮助。

1 个答案:

答案 0 :(得分:0)

您应该在实现文件中声明每个模板化函数的类型。

例如: 为了您的实施:

template <class T>
ShiftVec<T>::ShiftVec(vector<T> v) {
    vec = v;
}

您应该在实现下添加一行,如下所示:

template <class T>
ShiftVec<T>::ShiftVec(vector<T> v) {
    vec = v;
}
template ShiftVec<int>::ShiftVec(vector<int> v); // <<< this is the line added

上面的最后几行是关键。