got*_*ch4 -3 c++ linker templates
template<typename AT>
class growVector {
int size;
AT **arr;
AT* defaultVal;
public:
growVector(int size , AT* defaultVal); //Expects number of elements (5) and default value (NULL)
AT*& operator[](unsigned pos);
int length();
void reset(int pos); //Resets an element to default value
void reset(); //Resets all elements to default value
~growVector();
};
Run Code Online (Sandbox Code Playgroud)
和.cpp是
template<typename AT>
growVector<AT>::growVector(int size, AT* defaultVal) {
arr = new AT*[size];
this->size = size;
for (int i = 0 ; i < size; i++){
arr[i] = defaultVal;
}
}
template<typename AT>
AT*& growVector<AT>::operator [](unsigned pos){
if (pos >= size){
int newSize = size*2;
AT** newArr = new AT*[newSize];
memcpy(newArr, arr, sizeof(AT)*size);
for (int i = size; i<newSize; i++)
newArr[i] = defaultVal;
size = newSize;
delete arr;
arr = newArr;
}
return arr[pos];
}
//template<typename AT>
//const AT*& growVector<AT>::operator [](unsigned pos) const{
// if (pos >= size)
// throw std::range_error("index out of range in constant vector");
// }
// return NULL;
//}
template<typename AT>
int growVector<AT>::length(){
return size;
}
template<typename AT>
growVector<AT>::~growVector(){
delete arr;
}
template<typename AT>
void growVector<AT>::reset(int pos){
if (pos>=size)
throw new std::range_error("index out of bounds");
arr[pos] = defaultVal;
}
template<typename AT>
void growVector<AT>::reset(){
for (int pos = 0; pos<size; pos++)
arr[pos] = defaultVal;
}
Run Code Online (Sandbox Code Playgroud)
......非常基本的
我用它
int main() {
growVector<char> gv(5, (char*)NULL);
char* x = NULL;
for (int i = 0; i< 50; i++){
gv[i] = x;
}
gv.reset();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它编译但链接器说:
Invoking: GCC C++ Linker
g++ -pthread -o"base" ./src/base.o ./src/base/baseController.o ./src/base/baseThreads.o ./src/base/utils.o ./src/base/utils/utilClasses.o
./src/base.o: In function `main':
/home/dario/workspace/base/Debug/../src/base.cpp:95: undefined reference to `baseUtils::growVector<char>::growVector(int, char*)'
/home/dario/workspace/base/Debug/../src/base.cpp:98: undefined reference to `baseUtils::growVector<char>::operator[](unsigned int)'
/home/dario/workspace/base/Debug/../src/base.cpp:100: undefined reference to `baseUtils::growVector<char>::reset()'
/home/dario/workspace/base/Debug/../src/base.cpp:101: undefined reference to `baseUtils::growVector<char>::~growVector()'
/home/dario/workspace/base/Debug/../src/base.cpp:101: undefined reference to `baseUtils::growVector<char>::~growVector()'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我真的很无能为力
对于模板,通常,定义应放在头文件中,因为所有编译单元都需要它.
当您知道将调用模板类的类型时,有一些技巧可以避免这样做,但对于真正的通用问题,它只是不起作用.
注意:
如果我是你,我会使用一个STL容器,结果不太可能是马车.