własny manipulator do strumienia - dlaczego musi być globalny ?

0

mam taką prościutką rzecz


#include <iostream>
#include <iomanip>
using namespace std;

ostream & manip (ostream & strum){
	cout<<"__";
}

int main (){

	float flo=33.22;
	cout<<flo<<manip<<flo<<endl;
		
	return 0;
} 

tylko gdy fragment z własnym manipulatorem jest wewnątrz funkcji main to wywala błędy przy kompilacji - i nie za bardzo wiem dlaczego

0

jaki typ zwraca manipulator i co ty zwracasz? Ja nie widzę, żebyś cokolwiek zwracał.

0

no tak, powinno być

ostream & manip (ostream & strum){
        cout<<"__";
        return strum;
}

ale tak czy inaczej po wrzuceniu tego fragmentu do main() wywala błąd kompilacji

prog.cpp:12: error: a function-definition is not allowed here before ‘{’ token
prog.cpp:18: error: ‘manip’ was not declared in this scope

ta definicja jest jakaś szczególna, że musi być globalna ?

0

powiem ci szczerze kolego, że po skopiowaniu twojego kodu z pierwszego posta wszystko ładnie mi się skompilowało.

0

ale tak czy inaczej po wrzuceniu tego fragmentu do main() wywala błąd kompilacji

ZARAZ.
A czemu ty chcesz wrzucać deklarację funkcji do main?

0
bubu napisał(a)

powiem ci szczerze kolego, że po skopiowaniu twojego kodu z pierwszego posta wszystko ładnie mi się skompilowało.

tak, bo tam fragment

ostream & manip (ostream & strum){
        cout<<"__";
        return strum;
}

jest poza funkcją main - pod kodem napisałem, że problemy są gdy to przeniosę do wnętrza main - staram się dowiedzieć dlaczego,
poniższy kod powinien Ci sypnąć błędem

#include <iostream>
#include <iomanip>
using namespace std;
int main (){
        ostream & manip (ostream & strum){
               cout<<"__";
               return strum;
        }
 
        float flo=33.22;
        cout<<flo<<manip<<flo<<endl;
 
        return 0;
} 
aurel napisał(a)

ale tak czy inaczej po wrzuceniu tego fragmentu do main() wywala błąd kompilacji

ZARAZ.
A czemu ty chcesz wrzucać deklarację funkcji do main?

jak dla mnie to raczej jest definicja niż deklaracja

zacząłem to pisać i jedyną opcją na pozbycie się błędu (jaką znalazłem) jest wyrzucenie tego poza main

0

bo w c++ nie możesz takiej konstrukcji użyć. Nie jest to dozwolone.

0

O matko, to nie JavaScript. Tak się nie piszę, musi być poza main i już.

0

po pierwsze aby poprawnie działał musi być:
ostream & manip (ostream & strum) { return strum<<""; }
możesz do pliku:
mymanip.h wpisać:
ostream & manip (ostream & strum);
zaś w pliku mymanip.cpp wpisać:
ostream & manip (ostream & strum) { return strum<<"
"; }
tam gdzie go potrzebujesz dołączasz tylko #include "mymanip.h" a do projektu dołączasz plik mymanip.cpp
lub też robisz z tego bibliotekę.

0

wszystko powyższe zrozumiane, ale będzie jakaś różnica w stosowaniu
tego

_13th_Dragon napisał(a)

ostream & manip (ostream & strum) { return strum<<"__"; }

a tego

ostream & manip (ostream & strum){
        cout<<"__";
        return strum;
}

tzn, czy w jakichś sytuacjach może powodować to błędy ?

0

jeżeli użyjesz to na pliku to podkreślenia polecą na ekran a do pliku nić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1