我正在编写一个实现双向链表的程序。我的问题是,当我通过发出命令进行编译时
g++ -g -Wall DynamicSequenceVector.cpp DynamicSequenceVector.h main.cpp
我收到以下控制台输出
/tmp/cc6P5VZK.o: In function `main':
main.cpp:(.text+0x1a): undefined reference to `DynamicNode::DynamicSequenceVector<int>::DynamicSequenceVector(int)'
main.cpp:(.text+0x3a): undefined reference to `DynamicNode::DynamicSequenceVector<int>::~DynamicSequenceVector()'
main.cpp:(.text+0x4f): undefined reference to `DynamicNode::DynamicSequenceVector<int>::~DynamicSequenceVector()'
collect2: error: ld returned 1 exit status
我感觉这是我在 main.cpp 中导入文件的方式的问题,因为如果我将 main 函数移动到 DyanmicSequenceVector.cpp 文件中,它会编译得很好。此外,我仅在构造带有参数的新对象时收到这些编译错误。
动态序列 vector .h
#ifndef __DYNAMIC_VECTOR
#define __DYNAMIC_VECTOR
namespace DynamicNode {
template <class Type>
class DynamicSequenceVector {
private:
struct dynamicNode {
dynamicNode *previousLink;
dynamicNode *nextLink;
Type data;
int position;
};
int nodeCount;
int currentPosition;
dynamicNode *headNode;
dynamicNode *tailNode;
dynamicNode *currentNode;
dynamicNode *tempNode;
public:
DynamicSequenceVector();
DynamicSequenceVector(Type data);
~DynamicSequenceVector();
void appendNode(Type nodeData);
void accessData(int startingPosition, int endingPosition);
};
}
#endif
动态序列 vector .cpp
#include <iostream>
#include "DynamicSequenceVector.h"
using namespace std;
using namespace DynamicNode;
template <typename Type>
DynamicSequenceVector<Type>::DynamicSequenceVector() {
nodeCount = 0;
currentPosition = NULL;
headNode = NULL;
tailNode = NULL;
currentNode = NULL;
}
template <typename Type>
DynamicSequenceVector<Type>::DynamicSequenceVector(Type nodeData) {
nodeCount = 1;
currentPosition = 0;
headNode = new dynamicNode;
headNode->previousLink = NULL;
headNode->nextLink = NULL;
headNode->data = nodeData;
headNode->position = 0;
currentNode =
}
template <typename Type>
DynamicSequenceVector<Type>::~DynamicSequenceVector() {
while(nodeCount != 0) {
tempNode = tailNode->previousLink;
delete tailNode;
tailNode = tempNode;
}
return;
}
template <typename Type>
void DynamicSequenceVector<Type>::appendNode(Type nodeData) {
if (currentPosition == 0) {
headNode = new dynamicNode;
headNode->data = nodeData;
headNode->position = 0;
headNode->previousLink = NULL;
headNode->nextLink = NULL;
} else {
tempNode = new dynamicNode;
tempNode->data = nodeData;
tempNode->previousLink = tailNode;
tempNode->position = nodeCount + 1;
tailNode->nextLink = tempNode;
tailNode = tempNode;
}
nodeCount++;
}
template <typename Type>
void DynamicSequenceVector<Type>::accessData(int startingPosition,
int endingPosition) {
cout << "Data accessed";
return 0;
}
主要.cpp
#include <iostream>
#include "DynamicSequenceVector.h"
//using namespace std;
using namespace DynamicNode;
int main() {
DynamicSequenceVector<int> test();
DynamicSequenceVector<int> testingVector(5); // gives an error
//test = new DynamicSequenceVector<char>::DynamicSequenceVector();
std::cout << "Hello world!\n";
}
最佳答案
模板成员的实现必须在 header 中,而不是在单独的 .cpp 文件中。
编译 main.cpp 时,编译器需要实现可见,以便实例化 DynamicSequenceVector<int>
, 而那些是不可用的。因此,编译器假定模板实例化在另一个编译单元中可用,但事实并非如此,这就是链接器失败的原因。
(DynamicSequenceVector.cpp 文件在这里甚至没有做任何有用的事情——未实例化的模板成员实际上从未写到目标文件中,因为那没有任何意义。将内容移动到头文件中,然后删除 .cpp 文件是解决此问题的正确方法。)
或者,您可以将其添加到 DynamicSequenceVector.cpp 的底部:
template class DynamicSequenceVector<int>;
这将指示编译器实例化此版本的模板类,并使其在该编译单元中可用并从中导出。然后,当链接器去解析 main 的编译单元中的符号时,它将能够找到它们。
但是,这意味着您需要维护一个集中式列表,其中包含此模板类的每个实例。这是很多工作,通常被认为是个坏主意。
关于c++ - 编译期间未识别的引用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15555610/