Avatar billede oddi Nybegynder
27. marts 2010 - 01:46 Der er 3 kommentarer og
1 løsning

Member function template

Hej eksperter

Jeg har følgende funktion i min .h:

template <typename T> T getOption(const std::string& option);

Implementeringen:

template <typename T> T ProgOptions::getOption(const string& option)
{
    return vm_[option].as<T>();
}

Hvor klassen og funktionen bliver brugt:

ProgOptions options;
string str("SomeString");
cout << options.getOption<int>(str) << endl;

Men jeg bliver ved at få følgende fejl:
undefined reference to `int ProgOptions::getOption<int>(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'

Hvad gør jeg galt, kan man overhovedet gøre dette ?

Mvh
Oddi
Avatar billede bertelbrander Praktikant
27. marts 2010 - 01:55 #1
Det burde du kunne, men du skal have implementeringen i .h filen.
Avatar billede oddi Nybegynder
27. marts 2010 - 11:17 #2
Mange tak bertelbrander

Det virker hvis jeg sætter implementeringen i .h, men hvorfor skal den implementers i .h ? Hvorfor kan jeg ikke gøre som jeg gjorde ?

Mvh
Oddi

P.s smid et svar
Avatar billede bertelbrander Praktikant
27. marts 2010 - 13:38 #3
Når du instantierer din funktion, dvs. laver en getOption hvor T f.eks. er en int, laver compileren en funktion ud fra templaten, hvor T er en int. Hvis du derpå laver en hvor T er en double laver den en ny funktion. For at den kan lave disse funktioner skal den kende både T og implementeringen af funktionen.

Ved de fleste compilere (alle dem jeg har set) kræver at compileren har implementationen når den får brug for den, dvs. den skal være i en .h fil, eller i den .cpp fil hvori den bruges. Man kunne godt forstille sig at det var gjort på andre måder. Prøv at søge på keywordet "export" sammen med C++ på google, så vil du kunne se hvordan det var tænkt gjort. Men der er vist ingen compilere der understøtter "export"...

I sprog som Java og C# har man ikke det krav, men det skyldes at alle typer arver fra den samme base class der, og så laver man én funktion der kan håndtere alle type. Det er knapt så effektivt og kan ikke bruges med de simple type i C++.

Jeg samler stadig ikke på point.
Avatar billede oddi Nybegynder
27. marts 2010 - 22:14 #4
Ok, mange tak bertelbrander.
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