0

私はC++の経験がありますが、最近は仕事でのみpythonを使用しており、非常に錆びています。各ファイルを以下に示します。

main.cpp

#include "stack.h"

int main(int argc, char** argv){
    return 0;
}

stack.h

#ifndef STACK_H
#define STACK_H

#define NULL 0

template <class elementType>
class stack{

    struct node
    {
        elementType data;
        node* next;
    };

    node* top;

public:

    stack(){
        top = NULL;
    }

    ~stack(){
        node temp = top;
        while (top != NULL){
            top = top->next;
            delete temp;
        }
    }

    void push(elementType x){
        node temp = new node();
        temp.data = x;
        temp.next = top;
        top = temp;
    }

    elementType pop(){
        node temp = top;
        top = top->next;
        return temp;
    }

    bool isEmpty(){
        return top == NULL;
    }
};

#endif //STACK_H

makefile

a.out : main.o stack.o
    gcc -o a.out main.o stack.o

main.o : main.cpp stack.h 
    gcc -O -c main.cpp

stack.o : stack.h
    gcc -O -c stack.h

clean :
    rm main.o stack.o

したがって、cdプロジェクトディレクトリにアクセスして次のように入力すると、次のようにmakeなります。

gcc -O -c main.cpp
gcc -O -c stack.h
stack.h:7:10: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘&lt;’ token
make: *** [stack.o] Error 1

私は解決策を探していましたが、私のコードが正しいと言える限りです。私は実際のスタック実装の助けを探していません、そして私はこのコードが空のメインで実際には何もしないことに気づきます、しかし私はこのコンパイルエラーを修正することができないようです。

4

3 に答える 3

3

gcc ではなく、g++ を使用して C++ をコンパイルします。また、ヘッダーをコンパイルする必要はありません。

于 2012-09-17T15:38:30.713 に答える
2

C++ では、ヘッダー ファイルはコンパイルせず、ソース ファイルのみをコンパイルします。

また、C++ は gcc ではなく g++ でコンパイルします。

于 2012-09-17T15:37:43.817 に答える
1

gcc -c stack.cppgcc は .cpp を C++ の拡張子として認識し、ファイルを C++ としてコンパイルします。問題は次の場合に発生しgcc stack.hます。他の人が言ったように、ヘッダーをコンパイルしないでください。しかし、エラーの理由は、gcc がファイルを C++ ではなく C ファイルとして扱っているように見えるためです (不合理ではありませんが、それが何をするのか調べていません)。

ただし、リンクするときはg++、適切な C++ ランタイム ライブラリを使用するか指定する必要があります。こちらの方が使いやすいg++です。

ああ、そして にエラーがありますstack.hpop返品tempしますが、返品する必要がありますtemp.data

また、 という名前のマクロを定義する際にも注意してNULLください。標準ライブラリの定義と競合する可能性があります。コードは標準ライブラリのヘッダーを使用していないため、ここでは問題ありませんが、これは人為的なものです。

于 2012-09-17T15:51:02.883 に答える