0

ListというカスタムリストクラスのメソッドをC++で作成しようとしています。さまざまなアイテムであるノードで構成されたリンクリストです。このメソッドでは、ノードへのポインターを返したいのですが、「'ノード'は型を指定していません」というエラーが表示されます。sort()メソッドはまだ進行中であり、setMyNext()を待っていることに注意してください。

template<class Item>
class List {
public:
List();
List(const List& original);
virtual ~List();
void sort();

List& operator=(const List& original);
bool operator==(const List& original)const;
bool operator!=(const List& l2) const;

private:
void print()const;
unsigned mySize;
struct Node{
    Node();
    Node(Item item, Node * next);
    ~Node();
    void print()const;
    Node * setMyNext(Node * newNext);
    Item myItem;
    Node * myNext;
};

Node * myFirst;
Node * myLast;

friend class ListTester;
};



template<class Item>
List<Item>::List() {
myFirst=NULL;
myLast=NULL;
mySize=0;
}

 template<class Item>
List<Item>::List(const List& original){
myFirst=myLast=NULL;
mySize=0;
if(original.getSize()>0){
    Node * oPtr = original.myFirst;
    while(oPtr!=NULL){
        append(oPtr->myItem);
        oPtr=oPtr->myNext;
    }
}
}

template<class Item>
List<Item>::Node::Node(){
myItem=0;
myNext=NULL;
}


template<class Item>
List<Item>::Node::Node(Item item, Node * next){
myItem=item;
myNext= next;
}

template<class Item>
List<Item>::~List() {
//  cout<<"Deleting List..."<<endl;
delete myFirst;
myFirst=myLast=NULL;
mySize=0;
}

template<class Item>
void List<Item>::sort(){
//get my first 2 items
if(mySize<2)
    return;
Node * compareEarly=myFirst;
Node * compareLate=myFirst->myNext;
//compare
if(compareEarly->myItem > compareLate->myItem){
//If 2<1, set 0's next pointer to 2, set 2's next to 1, set 1's next to 3
    cout<<"big"<<endl;

}
    //This needs a set previous pointer and set next item's pointer

    //increment
}

template<class Item>
Node * List<Item>::Node::setMyNext(Node * newNext){
myNext=newNext;
}
4

2 に答える 2

1

Nodeは型に名前を付けないためです。

ここで参照しようとしているノードは、実際にはテンプレート クラス List 内のノードです。ただし、クラス宣言の外で関数を定義しているためです。関数の戻り値の型は、グローバル (または現在の名前空間) スコープにあります。したがって、コンパイラが正しい型を見つけるためには、Node の完全な名前を指定する必要があります。

要するに:

Node * List<Item>::Node::setMyNext(Node * newNext){

この行は間違っています。代わりにこれであるべきです。

typename List<Item>::Node* List<Item>::Node::setMyNext(Node * newNext){

同じことが他の機能にも当てはまります...

于 2012-10-18T18:31:46.327 に答える
0

あなたの問題は、関数定義がグローバル名前空間にあるため、コンパイラが 'Node *' の定義が何であるかを知らないことです。コンパイラがそれを認識するためには、それがどの名前空間の一部であるかを指定する必要があります。

template<class Item>
List<Item>::Node * List<Item>::Node::setMyNext(Node * newNext){
myNext=newNext;
}
于 2012-10-18T18:38:00.027 に答える