2012-04-22 25 views
6

Próbowałem google, ale zawsze wracam z różnymi problemami. Dostaję 3 nierozwiązanych urządzenia zewnętrzne, gdy próbuję skompilować ten program:C++ ciągle dostaję błąd LNK2019: nierozwiązany zewnętrzny symbol

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; 
} 

Odpowiedz

13

Musisz umieścić wszystkie implementacje szablonów, które posiadasz w pliku .cpp w pliku nagłówkowym lub w pliku zawartym w nagłówku. I nie próbuj kompilować pliku implementacji. Niektóre systemy próbują skompilować pliki z sufiksem .cpp. Kompilator musi zobaczyć kod w celu utworzenia instancji szablonów.

+1

Gdybym miał funta za każdym razem widzę to pytanie – EdChum

+0

@EdChum lub upvote :-) – juanchopanza

+0

Ach, ty mnie bić do niej – stijn

3

na dole DynIntStack.h umieścić

#include <DynIntStack.cpp> 

co się dzieje jest kompilator nie widzi kod wdrożenie szablonu, więc nie może emitować coś dla niego.

-2

Najbardziej Najprostszym rozwiązaniem tego problemu jest:

Gdziekolwiek chcesz dołączyć swoją klasę szablonu np "DynIntStack.h" zamiast tego "DynIntStack.cpp". na przykład w twoim main.cpp powyżej.

To proste, nie trzeba niczego zmieniać.

Powiązane problemy