Gå til innhold

Problem med deklarasjon av template(tror jeg)


Anbefalte innlegg

Heisan!

Driver å lager en kalkulator nå, den skal være litt mer enn en enkel +,-,* og / kalkulator(derfor har jeg laget en klasse), men dette er kun slik den er nå.

//Calc.cpp
#include <iostream>
#include <cctype>

template<class T> class Calc {
//typedef:
//Friends:
    friend template<T> std::ostream& operator<<(std::ostream&, const Calc<>&);
    friend template<T> std::istream& operator>>(std::istream&, Calc<T>&);
    friend template<T> Calc& operator+(Calc<T>&, Calc<T>&);
    friend template<T> Calc& operator-(Calc<T>&, Calc<T>&);
    friend template<T> Calc& operator*(Calc<T>&, Calc<T>&);
    friend template<T> Calc& operator/(Calc<T>&, Calc<T>&);
public:
Calc(): t(0) { }
private:
T t;
};
//-------------------------------Functions--------------------------------------------------
template<class T>
std::ostream& operator<<(std::ostream& os, const Calc<T>& v)
{
os << v.t;
return os;
}
template<class T>
std::istream& operator>>(std::istream& is, Calc<T>& v)
{
is.clear();
int a;
while(is.get(a) && isspace(a))
;
if(is)
 is >> v.t;
return is;
}
template<class T>
Calc<T>& operator+(Calc<T>& a, Calc<T>& b)
{
return (a.t+b.t);
}
template<class T>
Calc<T>& operator-(Calc<T>& a, Calc<T>& b)
{
return (a.t-b.t);
}
template<class T>
Calc<T>& operator*(Calc<T>& a, Calc<T>& b)
{
return (a.t*b.t);
}
template<class T>
Calc<T>& operator/(Calc<T>& a, Calc<T>& b)
{
return (a.t*b.t);
}

sånn, her har vi koden. Nå gjør jeg og fårfølgende i msys:

 

$ g++ Calc.cpp -o Calc.exe

Math.cpp:7: error: expected unqualified-id before "template"

Math.cpp:8: error: expected unqualified-id before "template"

Math.cpp:9: error: expected unqualified-id before "template"

Math.cpp:10: error: expected unqualified-id before "template"

Math.cpp:11: error: expected unqualified-id before "template"

Math.cpp:12: error: expected unqualified-id before "template"

 

Nå, jeg har prøvd mye men når jeg skriver progammet på denne måten får jeg ferrest error. Disse prøver jeg da å få bort(rettere sagt: har prøvd lenge å få bort)

Kan noen hjelpe?

 

Edit: Glemte å skrive selve problemet :blush::tease::w00t:

Endret av zirener
Lenke til kommentar
Videoannonse
Annonse

Å??? Jeg kan jo prøve å lage en helt ny kildekode og kompilere selv om det ikke burde ha noe å si...

Edit: Er å endre friend deklarasjonen det eneste du har gjort? Jeg prøvde å fjerne

Calc<T>& så det ble Calc& istedet men da ble det bare ennå verre.

 

Funka bedre nå, vet ikke helt hvorfor, men nå kom det en hel haug warning da.

Renger med at disse ikke har så mye å si, men tar dem med for det

Edit2:

Math.cpp:8: warning: friend declaration `std::ostream& operator<<(std::ostream&, const Calc<T>&)' declares a non-template function
Math.cpp:8: warning: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning
Math.cpp:9: warning: friend declaration `std::istream& operator>>(std::istream&, Calc<T>&)' declares a non-template function
Math.cpp:10: warning: friend declaration `Calc<T>& operator+(Calc<T>&, Calc<T>&)' declares a non-template function
Math.cpp:11: warning: friend declaration `Calc<T>& operator-(Calc<T>&, Calc<T>&)' declares a non-template function
Math.cpp:12: warning: friend declaration `Calc<T>& operator*(Calc<T>&, Calc<T>&)' declares a non-template function
Math.cpp:13: warning: friend declaration `Calc<T>& operator/(Calc<T>&, Calc<T>&)' declares a non-template function
c:/mingw/mingw/bin/../lib/gcc/mingw32/3.4.0/../../../libmingw32.a(main.o)(.text+0x97):main.c: undefined reference to `WinMain@16'
collect2: ld returned 1 exit status

dette får jeg etter å ha gjort som du sa. Det er jo ikke noen error, men det er jo g

Endret av zirener
Lenke til kommentar

#include <string>
#include <iostream>

using namespace std;

//Calc.cpp
#include <iostream>
#include <cctype>

template<class T> class Calc {
//typedef:
//Friends:
   friend  std::ostream& operator<<(std::ostream&, const Calc&);
   friend  std::istream& operator>>(std::istream&, Calc&);
   friend Calc& operator+(Calc&, Calc&);
   friend Calc& operator-(Calc&, Calc&);
   friend Calc& operator*(Calc&, Calc&);
   friend Calc& operator/(Calc&, Calc&);
public:
Calc(): t(0) { }
private:
T t;
};
//-------------------------------Functions--------------------------------------------------
template<class T>
std::ostream& operator<<(std::ostream& os, const Calc<T>& v)
{
os << v.t;
return os;
}
template<class T>
std::istream& operator>>(std::istream& is, Calc<T>& v)
{
is.clear();
int a;
while(is.get(a) && isspace(a))
;
if(is)
is >> v.t;
return is;
}
template<class T>
Calc<T>& operator+(Calc<T>& a, Calc<T>& b)
{
return (a.t+b.t);
}
template<class T>
Calc<T>& operator-(Calc<T>& a, Calc<T>& b)
{
return (a.t-b.t);
}
template<class T>
Calc<T>& operator*(Calc<T>& a, Calc<T>& b)
{
return (a.t*b.t);
}
template<class T>
Calc<T>& operator/(Calc<T>& a, Calc<T>& b)
{
return (a.t*b.t);
}
int main() { }

 

Compiling...

main.cpp

Linking...

 

test - 0 error(s), 0 warning(s)

Endret av saboi
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...