1

インストラクターから提供されたコードをコンパイルしようとしています (再入力する必要がありましたが、タイプミスが見つかりません)。コンパイルできません。このコードは後の課題で使用するので、そこに到達する前に機能させたいと考えています。

リンクリストベースのスタックを作成するだけです。コードがどのように機能するかを理解しており、以前にテンプレートを作成したことがありますが、コンパイルできない理由がわかりません。

最初の Stack.h

#ifndef STACK_H
#define STACK_H
//Stack definition file
//Stack.h



template<class ItemType>
struct NodeType<ItemType>; //Line 9



template<class ItemType>
class StackType {
public:
    StackType();
    ~StackType();
    void MakeEmpty();
    void Push(ItemType);
    void Pop(ItemType &);
    bool IsEmpty() const;
    bool IsFull() const;
    ItemType Top();

private:
    NodeType* topPtr;
};


template<class ItemType>
struct NodeType<ItemType> {
    int info;
    NodeType<ItemType>* next;
}; //Line 34

#include "Stack.cpp"

#endif

スタック.cpp

//Stack implemenation
#include <iostream>

template<class ItemType>
StackType<ItemType>::StackType() { //Line 5
    topPtr=NULL;
}


template <class ItemType>
StackType<ItemType>::~StackType() { //Line 11
    MakeEmpty();
}



template <class ItemType>
void StackType<ItemType>::MakeEmpty() {
    NodeType<ItemType>* tempPtr;

    while (topPtr != NULL) {
        tempPtr = topPtr;
        topPtr = topPtr->next;
        delete tempPtr;
    }
}

template <class ItemType>
void StackType<ItemType>::Pop(ItemType & item) {

    NodeType<ItemType>* tempPtr;
    item = topPtr->info;
    tempPtr = topPtr;
    topPtr = topPtr->next;
    delete tempPtr;
}

template<class ItemType>
void StackType<ItemType>::Push(ItemType item) {
    NodeType<ItemType>* location;
    location = new NodeType<ItemType>;
    location->info = newItem;
    location->next = topPtr;
    topPtr = location;
}

template <class ItemType>
bool StackType<ItemType>::IsEmpty() const {
    return (topPtr=NULL);
}

template <class ItemType>
bool StackType<ItemType>::IsFull() const {
    return (false);
}

template<class ItemType>
ItemType StackType<ItemType>::Top() {
        return topPtr->info;
}

およびmain.cpp

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

int main () {

    int whatever;
    StackType<int> s;
    s.Push(10);
    s.Push(1);
    s.Pop(whatever);
    return 0;

}

私が得るエラーは

c:\users\geldhart\dropbox\cs210\stack\stack.h(9):
エラー C2143: 構文エラー: ';' がありません 前 '<'
c:\users\geldhart\dropbox\cs210\stack\stack.h(9):
エラー C2059: 構文エラー: '<'
c:\users\geldhart\dropbox\cs210\stack\stack.h( 34):エラー C2753: 'NodeType': 部分的な特殊化は、プライマリ テンプレート Stack.cpp c:\users\geldhart\dropbox\cs210\stack\stack.cpp(5)
の引数リストと一致しません: エラー C2143: 構文エラー: 不足しています ' ;' 前 '<' c:\users\geldhart\dropbox\cs210\stack\stack.cpp(5): エラー C4430: 型指定子がありません - int と見なされます。 注: C++ は default-int c:\users\geldhart\dropbox\cs210\stack\stackをサポートしていません。






エラー C2988: 認識できないテンプレート宣言/定義
c:\users\geldhart\dropbox\cs210\stack\stack.cpp(5):
エラー C2059: 構文エラー: '<'
c:\users\geldhart\dropbox\cs210\stack\ stack.cpp(11):
エラー C2588: '::~StackType': 不正なグローバル デストラクタ
c:\users\geldhart\dropbox\cs210\stack\stack.cpp(11):
致命的なエラー C1903: 以前のエラーから回復できません(s); コンパイルの停止

4

1 に答える 1

3

この構文

template<class ItemType>
struct NodeType<ItemType>; //Line 9

おそらく、既存の一部を部分的に特殊化するためのものNodeTypeです。

型を(前方に)宣言するには、必要なのは

template<class ItemType>
struct NodeType;
于 2012-05-17T14:34:18.157 に答える