gpt4 book ai didi

c++ - 链接有问题

转载 作者:行者123 更新时间:2023-11-30 03:05:38 25 4
gpt4 key购买 nike

我有 3 个 C++ 文件: 通用堆栈.h:

template <class T> 
class Stack{
public:
Stack (int size){
top = -1;
MAX_SIZE = size;
v = new T (size);
}
~Stack(){ delete v;}

T pop();
void push (T);

class Underflow{};
class Overflow{};

private:
int top;
int MAX_SIZE;
T* v;
};

genericStackImpl.c++:

#include "genericStack.h"

template <class T>
void Stack <T> :: push (T c){
if (top == MAX_SIZE - 1) throw Overflow();
v[++top] = c;
}

template <class T>
T Stack <T> :: pop(){
if (top < 0) throw Underflow();
return v[top--];
}

驱动程序.c++:

#include <iostream>
#include "genericStack.h"
int main(){
Stack<char> sc(3);
try{
while (true) sc.push ('p');
}
catch (Stack<char>::Overflow){std::cout << "Overflow caught\n";}
try{
while (true) std::cout << sc.pop() << '\n';
}
catch (Stack<char>::Underflow){ std::cout << "Underflow caught\n";}
return 0;
}

当我使用 g++ 4.5 编译时:

g++ -o driver driver.c++ genericStackImpl.c++

我收到这些错误:

/tmp/ccLXRXgF.o: In function `main':
driver.c++:(.text+0x2e): undefined reference to `Stack<char>::push(char)'
driver.c++:(.text+0x3c): undefined reference to `Stack<char>::pop()'
collect2: ld returned 1 exit status

我不明白这是什么问题。如果我在驱动程序文件中移动实现,那么它会编译并运行。

最佳答案

一般来说,模板定义也需要在头文件中。一个异常(exception)是当您显式实例化或使用显式特化时,您都没有这样做。

解决此问题的一种方法是将 genericStackImpl.c++ 的内容移动到其头文件的底部。

这是因为模板函数不是实际函数,它们只是模板。使用(实例化)模板来创建实际 函数,这些就是您链接的对象。

genericStackImpl.c++ 中没有函数。这些函数只会在您使用它们时创建,即编译器第一次看到 sc.pushsc.pop 时。不幸的是,当 driver.c++ 尝试创建这些函数时,它找不到模板主体——它们隐藏在 genericStackImpl.c++ 中!相反,它只是编译对这些函数的引用,希望其他文件可以创建它们。

最后,当涉及到链接时,链接器无法在任何地方找到该函数,因此它会报错。

解决这个问题的另一种方法是在 genericStackImpl.c++ 中自己显式实例化这些函数,即

template class Stack<char>;

这将创建函数,链接器将找到它们。

这种方法的问题是它要求您事先知道您将在堆栈中使用什么类型,因此大多数人只是将模板定义放在头文件中。

关于c++ - 链接有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7560148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com