我创建了一个专门用于旋转矢量的类。 (我意识到这个功能基本上已经存在于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)
我不确定这里到底出了什么问题。向正确的方向推进会很有帮助。
答案 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
上面的最后几行是关键。