Jump to content
Sign in to follow this  
Dead_Rabbit

Problem med deklarasjon av template(tror jeg)

Recommended Posts

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:

Edited by zirener

Share this post


Link to post

Ok, takk, har prøvd dette men da får jeg warnings om at det ikke er en template funksjon, skal det være sånn her da? Trenger ikke funkjsonen å vite at det, f.eks er en Calc<int>?

 

PS: Si ifra hvis dårlig formulert.

Share this post


Link to post

Å??? 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

Edited by zirener

Share this post


Link to post

#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)

Edited by saboi

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...