문제

I have the file 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

Now I'm trying build it, but I have errors (1st and 2nd lines - Eclipce header):

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

(Note, the line links (like :188) are broken, because I threw out a lot of commented lines of code.)

Why I have that errors and what I should correct? As good as I understand,

void fromInt(int num);

and others are 'pre-definitions', and I don't see any other definitions of that methods.

Thank you for help.

도움이 되었습니까?

해결책

The functions that are defined outside of the class definition must either be moved to a source (.cpp) file or you must use the inline keyword at the front of them. Otherwise a copy of the function is placed into each source file that includes the header and marked as available to other modules, and the linker complains when there's more than one.

다른 팁

You say you included long_arithm.cpp in main. But you also compile it separately and then try to link the result with main.o. That's what causes the duplicates.

Looks like you didn't close the namespace definition and used its name inside the namespace for qualifying the function names, while defining them inside. Including this .cpp file inside other files may cause multiple definitions to occur inside different .cpp files, which cause the aforementioned problem.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top