私はintとdoubleを受け入れるためにリンクリスト(/スタック/キュー)をtempalitizeしようとしています。しかし、これまでのところ私はコードを動作させることができません。 (私はリスト/キューメンバ関数を取り出して、単にそれを動作させる/ビルド時にエラーを出さないようにしたので、主にスタックのものです) "template stuff"コードがうまくいきません。もし私が何かを見逃したり、何かを追加する必要があれば、LMK!LinkedList/Stackをテンプレート化しても機能しません!
1> LinkedList_Stack.obj:エラーLNK2019:未解決の外部シンボル "パブリック:__thiscall NumberList ::〜NumberList(無効)"?(?? 1 $ NumberList @ H @@ QAE私たちを得る
エラー@XZ)
1> LinkedList_Stack.obj _main機能で参照:エラーLNK2019:未解決の外部シンボル "パブリック:無効__thiscall NumberList ::ポップ(&をint型)"(ポップ@ $ NumberList @ H @@ QAEXAAH @? Z)は、関数_mainで参照されています
1> LinkedList_Stack.obj:エラーLNK2019:未解決の外部シンボル "public:void __thiscall NumberList :: push関数_mainで参照されている
1> F:\ Documents and Settings \ Riotson \ Desktop \ LinkList \ LinkedList_Stack_Queue_BNS11 \ Debug \ LinkedList_Stack_Queue_BNS11.exe:fatalエラーLNK1120:3つの未解決の外部
私はこのサイトで3つの異なる投稿を読み、それを模倣しようとしました(どこに置かれていて何がないか)。助けてください!!!
List.h:
#ifndef LIST_H
#define LIST_H
template<class T>
struct ListNode
{
T value; // Value in this node
struct ListNode<T> *next; // Pointer to the next node
};
// Class of LinkedList/Stack/Queue
template<class T>
class NumberList
{
private:
ListNode<T> *head, *rear; // List head pointer
public:
//Constructor
NumberList()
{ head = NULL; rear = NULL; }
//Destructor
~NumberList();
// Linked List Operations
void displayList() const;
//Stack operations
void push(T);
void pop(T &);
bool isEmpty();
};
template<class T>
void NumberList<T>::displayList() const
{
ListNode *nodePtr;
nodePtr = head;
while(nodePtr)
{
cout << nodePtr->value << endl;
nodePtr = nodePtr->next;
}
}
template<class T>
NumberList<T>::~NumberList()
{
ListNode<T> *nodePtr;
ListNode<T> *nextNode;
// Position nodePtr at the head of the list
nodePtr = head;
// While nodePtr is not at the end of the list....
while(nodePtr != NULL)
{
// Save a pointer to the next node.
nextNode = nodePtr->next;
// Delete the current node.
delete nodePtr;
// Position nodePtr at the next node.
nodePtr = nextNode;
}
}
template<class T>
void NumberList<T>::push(T num)
{
ListNode<T> *newNode; // Point to a new node
// Allocate a new node and store num there.
newNode = new ListNode;
newNode->value = num;
//If there are no nodes in the list
// make newNode the first node.
if(isEmpty())
{
head = newNode;
newNode->next = NULL;
}
else
{
newNode->next = head;
head = newNode;
}
}
template<class T>
void NumberList<T>::pop(T &num)
{
ListNode<T> *temp; // Temporary pointer
// First make sure stack isn't empty.
if(isEmpty())//Create a DynIntQueue object.
{
cout << "The stack is empty.\n";
}
else // pop value off the top of stack
{
num = head->value;
temp = head->next;
delete head;
head = temp;
}
}
// Member function isEmpty returns true if the stack/Queue
//is empty, or false otherwise.
template<class T>
bool NumberList<T>::isEmpty()
{
bool status;
if(!head)
status = true;
else
status = false;
return status;
}
#endif
メイン:
#include "List.h"
int main()
{ int catchVar; // To hold value popped off the stack
// Create a Dynamic IntStack object.
NumberList<int> stack;
// Push values onto stack
cout << "Pushing 1, 2, 3\n";
stack.push(1);
stack.push(2);
stack.push(3);
cout << endl;
// Pop the values off the stack
cout << "Popping...\n";
stack.pop(catchVar);
cout << catchVar << endl;
stack.pop(catchVar);
cout << catchVar << endl;
stack.pop(catchVar);
cout << catchVar << endl;
// Try to pop another value off the stack.
cout << "\nAttempting to pop again... " <<endl;
stack.pop(catchVar);
cout << endl;
// Templitization of a Double
cout << "Pushing a double of 1.5\n";
stack.push(1.5);
cout << endl;
cout << "Popping double 1.5...\n";
stack.pop(catchVar);
cout << catchVar << endl;
cout << "Templitization Succesful\n" << endl;
cout << endl;
return 0;
}
@Redinderienそんなこと?最後に追加するだけですか? – Riotson
はい。 .cppを完全に削除し、内容をヘッダーに移動します。テンプレート化されたコードは、特殊化されていない限りヘッダーになければなりません。 – Reinderien
それはトリックをした!どうもありがとうございます!!私はそれを理解しようと数時間を過ごしました。再度、感謝します! – Riotson