Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [Opgelost] functie die lid is van gespecialeerde class, buiten class declareren  (gelezen 1808 keer)

Offline Joshua822

  • Lid
Hallo allemaal.

Ja, weer zo'n zeer simpele vraag van mij :P

Neem dit stukje code :

#include <iostream>

template <typename T>

class calculate
{
    public:
        T add ( T a, T b );
};

template <typename T> T calculate <T>::add ( T a, T b )
{
    return a + b;
}

template <>
class calculate <float> {
    public:
        float add ( float a, float b )
        {
            std::cout << "This is the specialized class." << std::endl;
            return a + b;
        }
};

int main ()
{
    calculate <int> a;
    calculate <float> b;
    std::cout << a.add ( 10, 4 ) << std::endl;
    std::cout << b.add ( 10.4, 18.6 ) << std::endl;
    return 0;
}


Dit compileert zonder fouten en wordt perfect uitgevoerd. Maar stel dat ik de functie add van de gespecialiseerde class calculate buiten de functie wil declareren, zoals ik dit doe in deze code :

#include <iostream>

template <typename T>

class calculate
{
    public:
        T add ( T a, T b );
};

template <typename T> T calculate <T>::add ( T a, T b )
{
    return a + b;
}

template <>
class calculate <float> {
    public:
        float add ( float a, float b );
};

template <> float calculate <float>::add ( float a, float b )
{
       std::cout << "This is the specialized class." << std::endl;
       return a + b;
}

int main ()
{
    calculate <int> a;
    calculate <float> b;
    std::cout << a.add ( 10, 4 ) << std::endl;
    std::cout << b.add ( 10.4, 18.6 ) << std::endl;
    return 0;
}


dan compileert het programma niet. Ik zou echter niet weten wat hier fout aan is ?

PS : Ja, ik weet het, ik kan ook gewoon de functie binnen de class blijven definiëren, en in dit geval heeft specialisatie totaal geen nut, maar toch :P

Alvast bedankt !
« Laatst bewerkt op: 2009/12/29, 01:36:58 door Joshua822 »

Offline Rachid

  • Lid
    • rachidbm
    • Mijn blog
dan compileert het programma niet
Wat is de foutmelding dan? Wat zegt google over die melding?

Ik ben geen C++ guru. Maar je hebt een soort generale class die kan optellen. En je specifieke class doet dat optellen met floats. Ik denk dat die functie daarom binnen een class moet staan...
Maar C++ is voor mij een tijd geleden, dus weet het niet precies.
Ben je ook blij dat Ubuntu zo toegankelijk en gratis is, en wil je graag net als ik iets terugdoen, kijk dan eens rond bij mwanzo, dé poort naar het bijdragen aan Ubuntu en haar gemeenschap!

Offline Joshua822

  • Lid
Met de tweede code krijg ik deze foutmelding :



Voor het gemak van de helpende leden : regel 22 van de tweede code :

template <> float calculate <float>::add ( float a, float b )
En alhoewel ik je uitleg waardeer, denk ik, kijkend naar de foutmelding, niet dat daar het probleem ligt. Ik denk dat het ermee te maken heeft dat oftewel de template fout gedefinieerd is, of dat er iets mis is in lijn 22 qua de manier om de functie te definiëren. Maar ik weet het niet, ik kan er ook ontzettend naast zitten. En ja, definiëren in de class zelf is mogelijk, maar de functie buiten de class definiëren zou ook mogelijk moeten zijn.

Offline profoX

  • Lid
    • wesley
    • Lionslink
template <> moet je weglaten voor de functie definitie
je hebt het al gespecialiseerd door dat voor de klasse zelf te zetten, de functie definieer je gewoon
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline Joshua822

  • Lid
Bedankt voor de oplossing ;)

Offline Rachid

  • Lid
    • rachidbm
    • Mijn blog
Kijk, nu zijn mijn C++ templating skills ook weer een heel klein beetje beter :P
Ben je ook blij dat Ubuntu zo toegankelijk en gratis is, en wil je graag net als ik iets terugdoen, kijk dan eens rond bij mwanzo, dé poort naar het bijdragen aan Ubuntu en haar gemeenschap!