[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: C++: Problem with overloading a constructor when splitting a src file.



> 
> you have put an inline function inside a '.cc' file. since it is inline,
> it will NOT be included in the object file 'base.cc', and thus, during
> link, there base constructor will be undefined. this is your bug - not
> g++'s.
> 
> fixes:
> 
> 1. move the inline function into the header file.
> 2. make the function not 'inline'.
> 
> guy
> 



Are there no other options? In particular, one that is both inline and 
with split files? (inline for speed and splitting the src for 
readability)



> On Sun, 18 Nov 2001, Shaul Karl wrote:
> 
> > Date: Sun, 18 Nov 2001 01:38:10 +0200
> > From: Shaul Karl <shaulka@bezeqint.net>
> > To: linux-il@linux.org.il
> > Subject: C++: Problem with overloading a constructor when splitting a
> >   src file.
> >
> >   Part 1: this works as expected
> >   ------------------------------
> >
> > [01:27:40 tmp]$ cat main.cc
> > #include <iostream>
> > #include <string>
> >
> > using namespace std;
> >
> > class base
> > {
> >   public:
> >       base();
> >       base(string &str);
> > };
> >
> > class derived : public base
> > {
> >   public:
> >       derived(string &str) : base(str) {}
> > };
> >
> > inline base::base() {}
> >
> > inline base::base(string &str)
> > {
> >   cout << str << endl;
> > }
> >
> >
> > int main(void)
> > {
> >   string str("test succeeded.");
> >   derived testingDerived(str);
> > }
> >
> > [01:27:45 tmp]$ g++-3.0 -Wall -o main main.cc
> > main.cc: In function `int main()':
> > main.cc:30: warning: unused variable `derived testingDerived'
> > [01:29:10 tmp]$
> >
> >
> >
> >   Part 2: Why this does not work?
> >   -------------------------------
> >
> > Next I have tried to split this into 3 files:
> >
> > [01:19:08 tmp]$ more *.h *.cc
> > ::::::::::::::
> > header.h
> > ::::::::::::::
> > #include <iostream>
> > #include <string>
> >
> > using namespace std;
> >
> > class base
> > {
> >   public:
> >       base();
> >       base(string &str);
> > };
> >
> > class derived : public base
> > {
> >   public:
> >       derived(string &str) : base(str) {}
> > };
> > ::::::::::::::
> > base.cc
> > ::::::::::::::
> > #include "header.h"
> >
> > inline base::base() {}
> >
> > inline base::base(string &str)
> > {
> >   cout << str << endl;
> > }
> > ::::::::::::::
> > main.cc
> > ::::::::::::::
> > #include "header.h"
> >
> > int main(void)
> > {
> >   string str("test succeeded.");
> >   derived testingDerived(str);
> > }
> >
> >
> > [01:19:40 tmp]$ for f in *.cc; do C="g++-3.0 -Wall -c -o ${f%.*}.o $f";
> > echo $C;$($C); done; C="g++-3.0 -Wall -o main main.o base.o"; echo $C;
> > $($C);
> > g++-3.0 -Wall -c -o base.o base.cc
> > g++-3.0 -Wall -c -o main.o main.cc
> > main.cc: In function `int main()':
> > main.cc:6: warning: unused variable `derived testingDerived'
> > g++-3.0 -Wall -o main main.o base.o
> > main.o: In function `derived::derived(std::string&)':
> > main.o(.gnu.linkonce.t._ZN7derivedC1ERSs+0x10): undefined reference to
> > `base::base(std::string&)'
> > collect2: ld returned 1 exit status
> > [01:20:53 tmp]$
> 

-- 

    Shaul Karl
    email: shaulka (replace these parenthesis with @) bezeqint,
           delete the comma and the white space characters and add .net



=================================================================
To unsubscribe, send mail to linux-il-request@linux.org.il with
the word "unsubscribe" in the message body, e.g., run the command
echo unsubscribe | mail linux-il-request@linux.org.il