Avatar billede mysitesolution Nybegynder
06. juni 2006 - 08:17 Der er 19 kommentarer og
1 løsning

Undefined referrence, C++

Hej...

Har et lille problem med templates/namespaces...

Jeg har 3 filer, main.cpp, foo.h, foo.cpp

main.cpp:
http://pastebin.com/761805

foo.h:
http://pastebin.com/761806

foo.cpp:
http://pastebin.com/761807

Men hvis jeg i main.cpp ændrer "WidthList list();" til "WidthList list(10);" vil det ikke virke... vil jo gerne kunne give min constructor en parameter, hvordan?
Avatar billede mysitesolution Nybegynder
06. juni 2006 - 10:33 #1
Har fundet ud af, at det ikke er de templates, men nok namespaces... her er det samme problem, bare mere simpelt:

main.cpp:
#include "foo.h"

using namespace Name;

int main()
{
    Foo blah(10);
    return 0;
}



foo.h:
#ifndef FOO_H
#define FOO_H

namespace Name
{
    class Foo
    {
        public:
        Foo(short);
    };
}

#endif


foo.cpp:
#include "foo.h"

namespace Name
{
    Foo::Foo(short arg)
    {
    }
}
Avatar billede lars314 Nybegynder
06. juni 2006 - 12:20 #2
Prøv at fjerne foo.cpp filen og brug følgende foo.h i stedet

foo.h:
#ifndef FOO_H
#define FOO_H

namespace Name
{
    class Foo
    {
        public:
        Foo(short arg)
        {
        }
    };
}

#endif

eller evt.

foo.h:
#ifndef FOO_H
#define FOO_H

namespace Name
{
    class Foo
    {
        public:
        Foo(short);
    };

    Foo::Foo(short arg)
    {
    }
}

#endif
Avatar billede mysitesolution Nybegynder
06. juni 2006 - 13:19 #3
hej... tak for svar... hhm har fundet ud af, at den kode jeg postede lige før dig, virker? ved ikke om jeg glemte at gemme inden jeg compilede... så det er templates den er ivejen med :/

main.cpp:
#include "foo.h"

using namespace Name;

int main()
{
    Foo<unsigned char> blah(10);
    return 0;
}



foo.h:
#ifndef FOO_H
#define FOO_H

namespace Name
{
    template <class T>
    class Foo
    {
        public:
        Foo(short);
    };
}

#endif



foo.cpp:
#include "foo.h"

namespace Name
{
    template <class T>
    Foo<T>::Foo(short arg)
    {
    }
}
Avatar billede lars314 Nybegynder
06. juni 2006 - 13:24 #4
Prøv igen (uden foo.cpp):

foo.h:
#ifndef FOO_H
#define FOO_H

namespace Name
{
    template <class T>
    class Foo
    {
        public:
        Foo(short);
    };

  template <class T>
    Foo<T>::Foo(short arg)
    {
    }
}

#endif
Avatar billede mysitesolution Nybegynder
06. juni 2006 - 13:28 #5
det virker... :)

men... vil gerne kunne beholde header og source filer...
Avatar billede lars314 Nybegynder
06. juni 2006 - 14:45 #6
Avatar billede mysitesolution Nybegynder
06. juni 2006 - 15:51 #7
mega besværligt og uhensigtsmæssigt at skulle skrive:

template Foo<unsigned char>::Foo(short);

ved alle ens funktioner og forskellige typer...
Avatar billede stormy Nybegynder
06. juni 2006 - 16:57 #8
Måske en typedef kan hjælpe på dette besvær?
Avatar billede mysitesolution Nybegynder
06. juni 2006 - 18:41 #9
hvis du tænker:

using namespace Name;

int main()
{
    typedef Foo<unsigned char> Foo2;
    Foo2 blah(10);
    return 0;
}


så nej :(
Avatar billede mysitesolution Nybegynder
06. juni 2006 - 18:41 #10
kan man måske lave en typedef i header eller source fil, og på den vej løse det?
Avatar billede bertelbrander Novice
06. juni 2006 - 19:41 #11
Du er (næsten) nødt til at implementere dine template funktioner i header-filen, fordi de skal være i scope når de bruges.
Avatar billede mysitesolution Nybegynder
06. juni 2006 - 20:19 #12
jamen, er det ikke noget jusk, at kombinere h/cpp og h? synes, hvis jeg skal være helt ærlig, at strukturen på c++ er noget crap :/ kommer fra C# miljø, og damn, der er det til at forstå
Avatar billede bertelbrander Novice
06. juni 2006 - 20:32 #13
Det ér et problem og der er mange der har haft det samme problem som dig.

Der findes en metode til at omgå problemet som benytter sig af export keyword'et, men mig bekendt er det kun Comeau compileren der har implementeret denne feature, og jeg har aldrig mødt nogen der bruger den compiler:
http://www.comeaucomputing.com/

At templaten skal være i scope er mest fordi det er den letteste måde at lave compileren på.
Avatar billede bertelbrander Novice
06. juni 2006 - 20:36 #14
Har man iøvrigt rigtige templates i C# eller er det kun generics?
Avatar billede mysitesolution Nybegynder
06. juni 2006 - 20:45 #15
kun generics... vil sige at en kombination ville være bedst til mit behov...
Avatar billede bertelbrander Novice
06. juni 2006 - 20:56 #16
Det er noget lettere at lave generics uden at de er i scope når de skal bruges.
Avatar billede mysitesolution Nybegynder
06. juni 2006 - 21:05 #17
synes bare at konceptet med at have includes gør det meget mere indviklet... helt unødvendigt faktisk
Avatar billede bertelbrander Novice
06. juni 2006 - 21:57 #18
Om det er unødvendigt eller ikke kan diskuteres. Konceptet er meget gammelt og meget flexibelt. Det stammer fra den gang prototyper var en moderne unødvendig feature.

I C og C++ behøver objekt filer ikke indeholde andet end den rå binære kode, måden man bruger koden på er så beskrevet i header-filer.

Men det er nok ikke tilfældigt at C# har stjålet sit kocept fra Java som har stjålet det fra pascal som har stjålet det fra ...
Avatar billede mysitesolution Nybegynder
10. juni 2006 - 14:55 #19
yup tak for kommentare men mangler svar ;) så jeg kan give points... det virker jo nu
Avatar billede mysitesolution Nybegynder
22. september 2006 - 20:43 #20
så lukker jeg...
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