Avatar billede vandborg Nybegynder
14. juli 2007 - 14:29 Der er 5 kommentarer og
1 løsning

Udefineret reference til defineret funktion

Hej Eksperter!

Står med et irriterende problem. Er ved at udvikle multiplayer til et hobby spil, og har posted på forskellige fora for at finde en god løsning til min buffer. Det lader til at virke, så længe funktionerne defineres i den fil der benytter dem, i stedet for i sin egen fil. Lad mig lige give et eksempel da det er en forfærdelig forklaring, jeg kommer med :)

buffer.h:

class Serializable;

class Buffer
{
public:
    enum { MAX_SIZE = 1024 };
   
    char buf[MAX_SIZE];
    int length;
    int index;
   
    Buffer& operator<<(Serializable &t);   
   
    template < class T >
    Buffer& operator<<(T t);
};

class Serializable {
public:
    virtual void serialize( Buffer &b ) = 0;
};

buffer.cpp:

template < class T >
Buffer& Buffer::operator<<(T t)
{
  if ( (index + sizeof(T)) > MAX_SIZE) // error, overflow
  ;
 
  memcpy( &(buf[index]), &t, sizeof(T) );
  index += sizeof(T);
  length += sizeof(T);
  return *this;
}

Buffer& Buffer::operator<<(Serializable &t)
{
  t.serialize( *this );
  return *this;
}

Hvis min main.cpp ser således ud:

#include "buffer.h"

int main(int argc, char **argv)
{
  Buffer test; test.index = 0; test.length = 0;
  int lala = 2000;
  test << lala;
}

Får følgende fejl i ovenstående main funktion:

undefined reference to `Buffer& Buffer::operator<< <int>(int)'

Men hvis jeg ændrer main.cpp til at se således ud:

#include "buffer.h"

template < class T >
Buffer& Buffer::operator<<(T t)
{
  if ( (index + sizeof(T)) > MAX_SIZE) // error, overflow
  ;
 
  memcpy( &(buf[index]), &t, sizeof(T) );
  index += sizeof(T);
  length += sizeof(T);
  return *this;
}

Buffer& Buffer::operator<<(Serializable &t)
{
  t.serialize( *this );
  return *this;
}

int main(int argc, char **argv)
{
  Buffer test; test.index = 0; test.length = 0;
  int lala = 2000;
  test << lala;
}

I denne ændrede main.cpp fungerer alt perfekt, men jeg ønsker at have deklarationerne i deres egen filer. Jeg bruger C++ under Linux, Anjuta som IDE og gcc som compiler. Kan ikke gennemskue fejlen, og det har irriteret mig længe. Vil sætte pris på ethvert input. Hvis der er tvivl eller jeg har været uklar om mit problem visse steder, så stil endelig spørgsmål. Jeg er ivrig efter at løse dette problem.

På forhånd tak,
Vandborg.
Avatar billede arne_v Ekspert
14. juli 2007 - 16:00 #1
Det er den rigtige løsning at have buffer.cpp koden i en separat fil.

Du kan builde med:

g++ -c buffer.cpp -o buffer.o
g++ -c main.cpp -o main.o
g++ main.o buffer.o -o buffer

eller bedre lave der samme med make.

Jeg kender ikke Anjuta, men dte bør være muligt at få den til det samme.
Avatar billede scheea2000 Nybegynder
14. juli 2007 - 16:06 #2
Det er et skud i tågen, men:

Det lyder som om det ikke er din .h den includer - prøv at ændre filnavnet (og for en god ordens skyld klassenavnet :P) til noget andet.
Avatar billede vandborg Nybegynder
14. juli 2007 - 16:36 #3
Tak for svarene.

arne_v: anjuta laver en makefile for mig, og selve commandline ser ud som det du beskriver. det lader tilsyneladende til at der for mig opstår et problem ved funktionen:


template < class T >
Buffer& Buffer::operator<<(T t)
{
  if ( (index + sizeof(T)) > MAX_SIZE) // error, overflow
  ;

  memcpy( &(buf[index]), &t, sizeof(T) );
  index += sizeof(T);
  length += sizeof(T);
  return *this;
}

hvis jeg definerer denne i hver fil den benyttes fungerer det. min anden overload skaber ingen problemer, hvilket får mig til at tro at der ligger et problem ved mit template. lyder dette muligt?

scheaa2000: kan med sikkerhed sige det ikke er der problemet ligger.
Avatar billede arne_v Ekspert
14. juli 2007 - 16:49 #4
Det er mig som snork sover.

template kode skal over i .H filen fordi den først compiles når den instantieres
Avatar billede vandborg Nybegynder
14. juli 2007 - 16:52 #5
Mange tak for hjælpen, endnu en gang :)

Skriv et svar :)
Avatar billede arne_v Ekspert
14. juli 2007 - 21:53 #6
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester