【发布时间】:2009-10-27 14:59:20
【问题描述】:
我不是一位经验丰富的 C++ 程序员,我在编译时遇到了问题。我有一个使用模板的堆类:
template <class T>
class Heap
{
public:
Heap(const vector<T>& values);
private:
vector<T> d;
// etc.
};
然后在单独的实现文件中:
template <class T>
Heap<T>::Heap(const vector<T>& values)
{
d = values;
for (unsigned int i = d.size()-1; i > 0; i--) Heapify(ParentIndex(i));
}
// ... more implementation code ...
最后是 main.cc 文件:
int main (int argc, char *argv[])
{
vector<int> in;
unsigned int i;
while (cin >> i) in.push_back(i);
Heap<int> h = Heap<int>(in);
return 0;
}
我得到这些编译错误:
g++ -Wall -I/opt/local/include -c -o main.o main.cc
g++ -Wall -I/opt/local/include -c -o heap.o heap.cc
g++ -Wall -o heap main.o heap.o
Undefined symbols:
"Heap<int>::Heap(std::vector<int, std::allocator<int> > const&)", referenced from:
_main in main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [heap] Error 1
为什么不能编译?我认为链接器说它找不到构造函数,但我知道它创建了目标文件。
【问题讨论】:
-
堆构造函数是否定义在单独的文件中?这对模板不太适用。
标签: c++ class templates linker