c – typedef和template的未定义符号?
作者:互联网
参见英文答案 > Why can templates only be implemented in the header file? 16个
这看起来很简单,但我无法弄清楚出了什么问题.我正在实现C向量类(仅用于int,而不是模板),带有迭代器模板或typedef的函数在编译时给出了这些错误:
Undefined symbols:
"void vectorInt::assign<int>(int, int)", referenced from:
_main in ccNVdR23.o
"void vectorInt::assign<int*>(int*, int*)", referenced from:
_main in ccNVdR23.o
_main in ccNVdR23.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
源文件的重要部分是:
vectorInt.h
#include <cstdlib>
#include <stdexcept>
typedef unsigned int size_type;
class vectorInt {
private:
int* array;
size_type current_size;
size_type current_capacity;
public:
.
.
.
template <class InputIterator>
void assign(InputIterator first, InputIterator last);
void assign(size_type n, const int u);
};
#endif // VECTORINT_H
vectorInt.cpp
#include vectorInt.h
.
.
.
template <class InputIterator>
void vectorInt::assign(InputIterator first, InputIterator last) {
clear();
InputIterator it = first;
int count = 0;
while(it++ != last) {
count++;
}
reserve(count);
while(first != last) {
this->push_back(*first++);
}
}
void vectorInt::assign(size_type n, const int u) {
clear();
reserve(n);
for(int i=0; i<(int)n; i++)
push_back(u);
}
main.cpp中
#include <cstdlib>
#include <stdexcept>
#include <iostream>
#include "vectorInt.h"
using namespace std;
int main(int argc, char** argv) {
vectorInt first;
vectorInt second;
vectorInt third;
first.assign(7, 100);
vectorInt::iterator it;
it = first.begin()+1;
second.assign(it, first.end()-1); // the 5 central values of first
int myints[] = {1776,7,4};
third.assign(myints, myints+3); // assigning from array.
return 0;
}
仅供参考:我知道main方法使用了vectorInt :: iterator,但这不是问题,因此我没有在源代码中包含它.
解决方法:
模板代码获得2阶段编译.第一阶段仅包括基本语法检查.第二个阶段依赖于类型T,从编译器获得完整的编译.由于您的代码(实现)是在CPP文件中,它只会获得第一阶段编译,因此它不会包含在翻译单元中 – 不会生成任何目标文件.
对于模板,您必须允许编译器编译整个代码.同样,您需要将整个实现仅放在头文件中.您也可以在类声明后立即#include相应的CPP文件.
标签:c,templates,typedef,undefined-symbol 来源: https://codeday.me/bug/20190902/1791210.html