链接有问题
Something wrong with linking
我有三个c++文件:genericStack.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--];
}
driver.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 caughtn";}
try{
while (true) std::cout << sc.pop() << 'n';
}
catch (Stack<char>::Underflow){ std::cout << "Underflow caughtn";}
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
我不明白是什么问题。如果我在驱动程序文件中移动实现,那么它将编译并运行。
一般来说,模板定义也需要在头文件中。一个例外是当你显式实例化,或使用显式特化,这两个你都没有做。
解决这个问题的一种方法是将genericStackImpl.c++
的内容移到其头文件的底部。
这样做的原因是因为模板函数不是实际的函数,它们只是模板。模板被用来(实例化)创建实际的函数,而这些就是你链接的对象。
genericStackImpl.c++
中没有函数。这些函数只有在您使用它们时才会被创建,即编译器第一次看到sc.push
和sc.pop
时。不幸的是,当driver.c++
试图创建这些函数时,它找不到模板体——它们隐藏在genericStackImpl.c++
中!相反,它只是编译对这些函数的引用,希望其他文件也能生成它们。
最后,当涉及到链接时间时,链接器在任何地方都找不到该函数,因此它会给您一个错误。
另一种解决这个问题的方法是在genericStackImpl.c++
中显式地实例化这些函数,即
template class Stack<char>;
这将创建函数,并且链接器将找到它们。
这种方法的问题是,它要求你事先知道你要在堆栈中使用什么类型,所以大多数人只是把模板定义放在头文件中。
相关文章:
- 有根的二进制搜索树.保留与其父级的链接
- 静态数据成员的问题-修复链接错误会导致编译器错误
- Microsoft Visual中的此链接器错误有什么问题
- 为什么当我从语句检查中删除"+ mod"时,以下程序给出错误的答案。问题链接:https://www.codechef.com/problems/FFC219B
- 字符串文本不能有外部链接的原因是什么?
- PCL 和 CMake 的问题:链接时未定义统计异常值删除
- 尽管有静态链接,Opencv 3.2.0 .dll丢失
- VC++使用gumbo查询时出现问题(链接错误)
- λ可以有"C"链接吗?
- 使用CMake问题链接Boost(Ubuntu 14.04)
- MySQL连接器问题-链接等等
- 我有libstdc++6-dev,但仍然有stl链接错误
- C++链接器在Windows SDK中与DirectX有问题
- 链接有问题
- 内联命名空间变量有内部链接吗?如果没有,为什么下面的代码有效
- 复制链表,每个节点都有随机链接,每个节点都有一个变量,随机指向列表中的另一个节点
- MinGW 与 MSVC 的 dll 库问题链接(未定义的引用)
- 链接有问题
- 是否有任何链接器标志告诉在打开后延迟加载动态库
- GLEW库在链接时似乎有问题