Detta felmedelanden får jag när jag försöker överlagra Mycket snyggare och mer lättläst om du använder dig av < code C++ > när du skriver din kod här i forumet. Oooh, den kod snutten har jag aldrig fått lära mig att man måste skriva för att få ostream att fungera. Eftersom ostream ligger under ett namespace så måste man skriva så. Du kan även skriva using namespace std som du gjort i din fil där du har din main() metod. Detta är inte något nytt utan så har det alltid varit. Däremot kanske du inte använt dig av namespaces och då behöver man inte skriva detta utan då räcker det med att isotream är inkluderat innan. <b>>Detta är inte något nytt utan så har det alltid varit. </b> <b>Nej, det introducerades väl först 94 eller 98?</b> Nu skulle jag vilja länka till en diskussion jag och Niklas hade en gång om att använda using i det globala namnrummet, men hur hittar man den gamla tråden?heeelp, ostream &operator<<(...);
& kompilera "friend ostream &operator<<()":
Error E2061 andgate.h 17: Friends must be functions or classes
Error E2139 andgate.h 17: Declaration missing ;
Error E2321 andgate.h 18 Declaration does not specify a tag or an
identifier
Error E2247 andgate.cpp 51: 'ANDgate::in' is not accessible in function
operator <<(ostream &, const ANDgate &)
Error E2247 andgate.cpp 51: 'ANDgate::out' is not accessible in function
operator <<(ostream &, const ANDgate &)
Jag använder kompilatorn Borland C++ 5.6, genom kommandoraden.
Vet ni vad jag gör för fel?
I C++ boken står det att man ska kunna överlagra operatorn ostream.
#ifndef _ANDGATE_H_
#define _ANDGATE_H_
const int ANDMAX=2;
class ANDgate
{
private:
int in[ANDMAX];
int out;
public:
ANDgate();
ANDgate(int x1, int x2);
int getout(const int x1, const int x2) const;
friend ostream &operator<<(ostream &os, const ANDgate &and);
};
#endif
-----------------------
#include <iostream>
#include "andgate.h"
using namespace std;
ANDgate::ANDgate()
{
for(int i=0; i<ANDMAX; i++)
in[i]=false;
out=false;
}
ANDgate::ANDgate(int x1, int x2)
{
in[0]=x1;
in[1]=x2;
out=ANDgate::getout(x1, x2);
}
int ANDgate::getout(const int x1, const int x2) const
{
if(x1==1 && x2==1)
return 1;
else if(x1<0 || x1>1 || x2<0 || x2>1)
{
cout<<"Error! Ingångarnas tillstånd får bara vara 0 eller 1.";
return 0;
}
else
return 0;
}
ostream &operator<<(ostream &os, const ANDgate &and)
{
os<<"Grinden AND:\n";
os<<"x1\tx2\tout\n";
//os<<and.in[0]<<"\t"<<and.in[1]<<"\t"<<and.out<<"\n";
return os;
}
-------------
#include <iostream>
#include "andgate.h"
using namespace std;
int main()
{
ANDgate och=ANDgate(1, 1);
cout<<och;
return 0;
}Sv: heeelp, ostream &operator<<(...);
Du har gjort helt rätt bortsett från att du glömt att lägga till using std::ostream; i din .h fil.Sv:heeelp, ostream &operator<<(...);
Märkligt, har jag aldrig behövt skriva förrut, när jag läste på KTH. Det fungerade klanderfritt utan.
Varför måste man göra de nu vid nyare versioner av kompilatorer?
Ok, tack så mycket.Sv: heeelp, ostream &operator<<(...);
Sv:heeelp, ostream &operator<<(...);
Nej, det introducerades väl först 94 eller 98?
Sen bör man ju absolut inte använda using i det globala uttrymmet.
Skriv hellre std::ostream, överallt där du har ostream (etc.).Sv: heeelp, ostream &operator<<(...);
Det har du nog helt rätt i att det introducerades någon gång under 90-talet
<b>Sen bör man ju absolut inte använda using i det globala uttrymmet.</b>
Välldigt sällan det leder till något problem att använda using. I mindre projekt kan det till och med vara fördel att använda using för att göra koden mer lättläslig. Sv: heeelp, ostream &operator<<(...);