2012-04-22 228 views
6

Tôi đã cố gắng google điều này nhưng luôn quay trở lại với các vấn đề khác nhau. Tôi nhận được 3 externals chưa được giải quyết khi tôi cố gắng để biên dịch chương trình này:C++ tiếp tục gặp lỗi LNK2019: biểu tượng bên ngoài chưa được giải quyết

1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall DynIntStack<char>::~DynIntStack<char>(void)" ([email protected]@@[email protected]) referenced in function _main 
1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall DynIntStack<char>::pop(char &)" ([email protected][email protected]@@[email protected]) referenced in function _main 
1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall DynIntStack<char>::push(char)" ([email protected][email protected]@@[email protected]) 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; 
} 

Trả lời

13

Bạn cần phải đặt tất cả các triển khai mẫu mà bạn có trong tệp .cpp của bạn trong tệp tiêu đề hoặc trong tệp có tiêu đề. Và đừng cố biên dịch tệp triển khai. Một số hệ thống cố gắng biên dịch tệp với hậu tố .cpp. Trình biên dịch cần xem mã để tạo mẫu.

+1

Nếu tôi có một bảng Anh cho mỗi lần tôi thấy câu hỏi này – EdChum

+0

@EdChum hoặc upvote :-) – juanchopanza

+0

ah, bạn đánh bại tôi với nó – stijn

3

ở dưới cùng của DynIntStack.h, đặt

#include <DynIntStack.cpp> 

gì đang xảy ra là trình biên dịch không thấy đoạn mã mẫu thực hiện vì vậy không thể phát ra bất cứ điều gì cho nó.

-2

Giải pháp đơn giản nhất cho vấn đề là:

Bất cứ nơi nào bạn muốn bao gồm lớp mẫu của mình, ví dụ: "DynIntStack.h" thay vì làm "DynIntStack.cpp". ví dụ. trong main.cpp của bạn ở trên.

Đơn giản như vậy, không cần phải thay đổi gì khác.

Các vấn đề liên quan