I'm not quite sure what's going on here. *Maybe* this is invalid code, but I belive it's a compiler bug because the error goes away when I remove completely unrelated lines in the program. Anyway, I get the following with 4.3 (it compiles with 4.1): (sid)6870:tbm@em64t: ~] g++ -c -g -O -o test.o test.cc (sid)6871:tbm@em64t: ~] g++ -o x test.o test.o: In function `Timer': /home/tbm/timer.h:13: undefined reference to `vtable for Timer' test.o: In function `Timer::timerEnd()': /home/tbm/timer.h:20: undefined reference to `Timer::ttime() const' test.o: In function `~Timer': /home/tbm/timer.h:16: undefined reference to `vtable for Timer' /home/tbm/timer.h:16: undefined reference to `vtable for Timer' collect2: ld returned 1 exit status test.cc: #include "timer.h" #include <getopt.h> #include <string> enum {O_ROW_PLOT, O_VERSION}; static struct option my_options[] = { {"row-plot", 1, 0, O_ROW_PLOT}, {"version", 0, 0, O_VERSION}, {0, 0, 0, 0} }; void test(double d) { } int main (int argc, char *const argv[]) { std::string strOutFile; Timer timerProgram; while (1) { char* endptr; int c = getopt_long (argc, argv, "", my_options, NULL); if (c == -1) break; switch (c) { case O_ROW_PLOT: strtol(optarg, &endptr, 10); break; case O_VERSION: return (0); } } test(timerProgram.timerEnd()); return (0); } timer.h: #ifndef _TIMER_H #define _TIMER_H #pragma interface "timer.h" #include <cstdlib> #include <sys/time.h> class Timer { public: Timer (void) {} ~Timer (void) {} virtual double timerEnd (void) { return ttime(); } protected: double ttime(void) const { struct timeval now; gettimeofday (&now, NULL); return 0; } }; #endif // _TIMER_H
There is no `#pragma implementation ' so I don't think this is a bug.
Any idea why it works when I remove completely unrelated lines, e.g. if (c == -1) break; Is this just a coincidence?
(In reply to comment #1) > There is no `#pragma implementation ' so I don't think this is a bug. This doesn't seem to help either.
You need to put it at the top of the file.
(In reply to comment #4) > You need to put it at the top of the file. That works. Still, a better diagnostic would be nice if that's possible.
Read: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/C_002b_002b-Interface.html This is all documented there. Really "#pragma interface"/"#pragma implementation" is useless for 99% of the code now adays because of comdat. Yes people use older compilers but this is not our issue.