Avatar billede kernelx Juniormester
12. november 2004 - 10:48 Der er 8 kommentarer og
1 løsning

Templates og C++

Hi,

jeg har en klasse ...
---------------------
template <typename T> class Test
{
    private:
        // variabler og funktioner

    public:
        int testing (int i);
};


// og her kommer problemet
int Test::testing (int i)
{
    return i;
}


int main ()
{
    // C++-Code
}
--------------------

hvordan kan jeg lave en klasse-metode (funktion), som bliver defineret
uden for klassen selv - hvis klassen gør brug af templates???

med venlig hilsen
KernelX
Avatar billede segmose Nybegynder
12. november 2004 - 11:12 #1
Du mangler template argumentet til den.

int Test::testing<int> (int i)
{
    return i;
}

hvis din instance var af typen int, eller <> hvis du ikke bruger den her (tror jeg nok).
Avatar billede arne_v Ekspert
12. november 2004 - 11:22 #2
Mit forslag:

template <typename T>
int Test<T>::testing (int i)
{
    return i;
}
Avatar billede arne_v Ekspert
12. november 2004 - 11:25 #3
Lidt tilrettet komplet eksempel:

#include <iostream>

using namespace std;

template <typename T>
class Test
{
    private:
        T v;
    public:
        Test(T v) { this->v = v; };
        T testing (int i);
};


template <typename T>
T Test<T>::testing(int i)
{
    return i*v;
}


int main ()
{
    Test<int> t1(123);
    cout << t1.testing(2) << endl;;
    Test<double> t2(123.456);
    cout << t2.testing(2) << endl;;
    return 0;
}
Avatar billede kernelx Juniormester
12. november 2004 - 11:27 #4
#include <iostream>
using namespace std;

template <typename T> class Test
{
    private:
        // variabler og funktioner

    public:
        int testing (int i);
};


// og her kommer problemet
int Test<int>::testing (int i)
{
    return i;
}


int main ()
{
    Test<int> x;
    cout << x.testing (6) << "\n";
}

det virker nu ... er reglen så, at det altid skal være return-typen, som skal stå i de spidse paranteser? Hvis jeg lod de spidse paranteser være tom, virkede det ikke ...
Avatar billede arne_v Ekspert
12. november 2004 - 11:34 #5
Nej det er den type der svarer til T i class.

Og med det approach skal du selv skrive en metode for hver ttype du vil bruge.

Det er derfor at jeg også vil template den, foprdi så skal du kun skrive den en gang !
Avatar billede kernelx Juniormester
12. november 2004 - 11:40 #6
altså min klasse skal jo få T som typename ... men metoden ... skal aflevere en int-value uafhængig af, hvad jeg senere i main har sat T til at være.

hvis jeg i main siger
Test<bool> x;

så skal metoden alligevel aflevere en int-value ...
Avatar billede kernelx Juniormester
12. november 2004 - 11:45 #7
ahhhh .... nu fik jeg den!!!

template <typename T> class Test
{
    public:
        int testing (void);
};

template <typename T> int testing<T> (void)
{
  /*
        nu kan jeg returne med int
        og kan alligevel bruge T
    */
}

mange tak!!!
husk at skrive ting som svar ... pga. points
Avatar billede arne_v Ekspert
12. november 2004 - 12:01 #8
svar
Avatar billede arne_v Ekspert
12. november 2004 - 12:02 #9
Kan

template <typename T> int testing<T> (void)
{

ikke være

template <typename T> int testing (void)
{

?
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