1

ファイル long_arithm.cpp があります。

#ifndef LONG_ARITHM.CPP
#define LONG_ARITHM.CPP

#include <iostream>
#include <list>

namespace long_arithm {

    typedef signed char schar;
    enum { error_char = 127 };

    class longint {
    public:
        longint() : minusSign(0), array() { }
        longint(int num) { fromInt(num); }
        longint(std::string str) { fromString(str); }
        longint(const longint& other) : minusSign(other.minusSign), array(other.array) { }

        void fromInt(int num);
        void fromString(std::string str);

    protected:
        schar digtochar(schar num);
        schar chartodig(schar ch);

        inline bool isDigit(schar ch) { /* code */ }
        inline bool isSpaceChar(schar ch) { /* code */ }

    private:
        bool minusSign;
        std::list<schar> array;
    };
};


void long_arithm::longint::fromInt(int num) {
    /* code */
}

void long_arithm::longint::fromString(std::string str) {
    /* code */

long_arithm::schar long_arithm::longint::digtochar(schar num) {
    /* code */
}

long_arithm::schar long_arithm::longint::chartodig(schar ch) {
    /* code */
}

#endif

今、ビルドしようとしていますが、エラーがあります (1 行目と 2 行目 - Eclipce ヘッダー):

Building target: long_arithmetics
Invoking: Cross G++ Linker
g++  -o "long_arithmetics"  ./long_arithm.o ./main.o   
./main.o: In function `long_arithm::longint::fromInt(int)':
/home/gxoptg/Документы/My works/Developing/C++/long_arithmetics/Debug/../long_arithm.cpp:153: multiple definition of `long_arithm::longint::fromInt(int)'
./long_arithm.o:/home/gxoptg/Документы/My works/Developing/C++/long_arithmetics/Debug/../long_arithm.cpp:153: first defined here
./main.o: In function `long_arithm::longint::fromString(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
/home/gxoptg/Документы/My works/Developing/C++/long_arithmetics/Debug/../long_arithm.cpp:168: multiple definition of `long_arithm::longint::fromString(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
./long_arithm.o:/home/gxoptg/Документы/My works/Developing/C++/long_arithmetics/Debug/../long_arithm.cpp:168: first defined here
./main.o: In function `long_arithm::longint::chartodig(signed char)':
/home/gxoptg/Документы/My works/Developing/C++/long_arithmetics/Debug/../long_arithm.cpp:204: multiple definition of `long_arithm::longint::chartodig(signed char)'
./long_arithm.o:/home/gxoptg/Документы/My works/Developing/C++/long_arithmetics/Debug/../long_arithm.cpp:204: first defined here
./main.o: In function `long_arithm::longint::digtochar(signed char)':
/home/gxoptg/Документы/My works/Developing/C++/long_arithmetics/Debug/../long_arithm.cpp:188: multiple definition of `long_arithm::longint::digtochar(signed char)'
./long_arithm.o:/home/gxoptg/Документы/My works/Developing/C++/long_arithmetics/Debug/../long_arithm.cpp:188: first defined here

(注: 行リンク (:188 など) は壊れています。これは、コードのコメント行を大量に捨てたためです。)

なぜそのエラーが発生し、何を修正する必要があるのですか? わかる範囲で、

void fromInt(int num);

その他は「事前定義」であり、そのメソッドの他の定義はありません。

ご協力ありがとう御座います。

4

3 に答える 3

6

クラス定義の外で定義されている関数は、ソース (.cpp) ファイルに移動するか、関数inlineの前にキーワードを使用する必要があります。それ以外の場合、関数のコピーは、ヘッダーを含む各ソース ファイルに配置され、他のモジュールで使用できるものとしてマークされます。複数ある場合、リンカーは文句を言います。

于 2012-04-22T14:33:53.320 に答える
3

あなたlong_arithm.cppはメインに含まれていると言います。ただし、それを個別にコンパイルしてから、結果を とリンクしようとしmain.oます。それが重複の原因です。

于 2012-04-22T14:43:00.133 に答える
1

名前空間の定義を閉じておらず、名前空間内でその名前を使用して関数名を修飾し、内部で定義しているようです。この .cpp ファイルを他のファイル内に含めると、異なる .cpp ファイル内で複数の定義が発生し、前述の問題が発生する可能性があります。

于 2012-04-22T14:19:30.813 に答える