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

On Sun, 18 Nov 2001, Shaul Karl wrote:

> Date: Sun, 18 Nov 2001 01:38:10 +0200
> From: Shaul Karl <[EMAIL PROTECTED]>
> To: [EMAIL PROTECTED]
> 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]$


=================================================================
To unsubscribe, send mail to [EMAIL PROTECTED] with
the word "unsubscribe" in the message body, e.g., run the command
echo unsubscribe | mail [EMAIL PROTECTED]

Reply via email to