C++ 不断收到错误 LNK2019 : unresolved external symbol

标签 c++ templates linker

<分区>

我试着用谷歌搜索这个,但总是遇到不同的问题。当我尝试编译这个程序时,我得到了 3 个 Unresolved external 问题:

1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall DynIntStack<char>::~DynIntStack<char>(void)" (??1?$DynIntStack@D@@QAE@XZ) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall DynIntStack<char>::pop(char &)" (?pop@?$DynIntStack@D@@QAEXAAD@Z) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall DynIntStack<char>::push(char)" (?push@?$DynIntStack@D@@QAEXD@Z) referenced in function _main

DynIntStack.h

/****************************************************************************
DynIntStack class.

Chad Peppers

This class creates a object for stacking nodes

In addition, there should be member functions to perform the following 
operations:
- Push to the stack
- Pop to the stack
- Function to check if empty

****************************************************************************/
// Specification file for the DynIntStack class
#ifndef DYNINTSTACK_H
#define DYNINTSTACK_H

template <class T>
class DynIntStack
{
private:
   // Structure for stack nodes
   struct StackNode
   {
      T value;        // Value in the node
      StackNode *next;  // Pointer to the next node
   };

   StackNode *top;      // Pointer to the stack top

public:
   // Constructor
   DynIntStack()
      {  top = NULL; }

   // Destructor
   ~DynIntStack();

   // Stack operations
   void push(T);
   void pop(T &);
   bool isEmpty();
}; 
#endif

DynIntStack.cpp

/****************************************************************************
DynIntStack class.

Chad Peppers

This class creates a object for stacking nodes

In addition, there should be member functions to perform the following 
operations:
- Push to the stack
- Pop to the stack
- Function to check if empty

****************************************************************************/

#include <iostream>
#include "DynIntStack.h"
using namespace std;

/*************************************************************************
Basic class constructor.

Input Parameters:  Information to build the  stack

Return Type:  void

*************************************************************************/

template<class T>
DynIntStack<T>::~DynIntStack()
{
   StackNode *nodePtr, *nextNode;

   // Position nodePtr at the top of the stack.
   nodePtr = top;

   // Traverse the list deleting each node.
   while (nodePtr != NULL)
   {
      nextNode = nodePtr->next;
      delete nodePtr;
      nodePtr = nextNode;
   }
}

/*************************************************************************
Function to push an item in the stack

Input Parameters:  T

Return Type:  void

*************************************************************************/

template<class T>
void DynIntStack<T>::push(T num)
{
   StackNode *newNode; // Pointer to a new node

   // Allocate a new node and store num there.
   newNode = new StackNode;
   newNode->value = num;

   // If there are no nodes in the list
   // make newNode the first node.
   if (isEmpty())
   {
      top = newNode;
      newNode->next = NULL;
   }
   else  // Otherwise, insert NewNode before top.
   {
      newNode->next = top;
      top = newNode;
   }
}

/*************************************************************************
Function to pop an item in the stack

Input Parameters:  T

Return Type:  void

*************************************************************************/
template<class T>
void DynIntStack<T>::pop(T &num)
{
   StackNode *temp; // Temporary pointer

   // First make sure the stack isn't empty.
   if (isEmpty())
   {
      cout << "The stack is empty.\n";
   }
   else  // pop value off top of stack
   {
      num = top->value;
      temp = top->next;
      delete top;
      top = temp;
   }
}

/*************************************************************************
Basic class deconstructor.

Input Parameters:  None

Return Type:  void

*************************************************************************/
template<class T>
bool DynIntStack<T>::isEmpty()
{
   bool status;

   if (!top)
      status = true;
   else
      status = false;

   return status;
}

main.cpp

#include <iostream>
#include "DynIntStack.h"
using namespace std;

int main(){

    int value = 0;
    char value2;
    //DynIntStack<int> stack;
    DynIntStack<char> stack1;

    cout << "Pushing 1\n";
    stack1.push('T');
    stack1.pop(value2);
    cout << value2;

    system("pause");
    return 0;
}

最佳答案

您需要将 .cpp 文件中的所有模板实现放在头文件中,或者放在头文件中。并且不要尝试编译实现文件。一些系统试图编译带有 .cpp 后缀的文件。编译器需要查看代码才能实例化模板。

关于C++ 不断收到错误 LNK2019 : unresolved external symbol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10271796/

相关文章:

c++ - 如何使用 glm::lookAt() 旋转对象?

c++ - 关于模板继承

c++ - OpenSSL 1.0.1f 和 "undefined reference to symbol ' SSL_state@@OPENSSL_1.0.0"

c++ - vector 复制不起作用,但手动 push_back 可以

C++ 概念和模板特化;如何获得用户友好的编译器错误

c++ - 双重乘法的模板元编程

c - 使用非标准名称链接 C 库

windows - 为 Windows 编译 Linux 应用程序 (C)

c++ - 使用 Google Mocks 模拟免费函数

c++ - 使另一个实例成为模板类的 friend