c++ - 编译期间未识别的引用错误

标签 c++ compilation compiler-errors

我正在编写一个实现双向链表的程序。我的问题是,当我通过发出命令进行编译时

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/

相关文章:

c++ - 马尔可夫随机场是否在 OpenCV 中实现?

C++:编译某些代码所需的前向类定义

java - 使用 janino 将 java 源代码从字符串编译为字节数组中的字节码

c - 我无法编译 vortex1.c 文件,当我尝试获取 .exe 文件时,它还会返回 .o 文件

c++ - Qt QPainterpath.h 错误

qt moc.exe 错误

C++ - 混合默认成员初始值设定项和成员初始化列表 - 坏主意?

c++ - 从深度重建位置会导致照明不正确

c++ - 如何在 C++ 中声明/定义相互依赖的模板?

c# - 我在 JIT/CLR 中发现了一个错误 - 现在我该如何调试或重现它?