Thread overview |
---|
December 14, 2017 overload | ||||
---|---|---|---|---|
| ||||
I know that this community is not from c ++, but for some time I studied how to do overload of ostream operators in c ++ and I even managed to get to this result, I got to this result in another post done here but I did not understand the that it returns this error below: bin2.cxx:44:43: error: expected ‘,’ or ‘...’ before ‘(’ token std::ostream& operator<<(std::ios_base& (__cdecl *_Pfn)(std::ios_base&)) ^ bin2.cxx: In member function ‘std::ostream& BinStream::operator<<(std::ios_base&)’: bin2.cxx:46:16: error: ‘_Pfn’ was not declared in this scope return os <<_Pfn; so that the output is the same as below: 127 em binario: 0001111111 127 em octal: 177 127 em binario: 0001111111 127 em hexadecimal: 7f 127 em decimal: 127 127 em binario: 0001111111 and not this: 127 em binario: 0001111111 127 em octal: 0001111111 127 em binario: 0001111111 127 em hexadecimal: 0001111111 127 em decimal: 0001111111 127 em binario: 0001111111 #include <ios> //ios_base #include <sstream> #include <climits> // CHAR_BIT #include <iostream> #include <algorithm> // reverse struct BinStream { std::ostream& os; BinStream(std::ostream& os) : os(os) {} std::string binario(unsigned int n) { //converte numero para string de bits std::stringstream bitsInReverse; //int nBits = sizeof(n) * CHAR_BIT; unsigned int nBits = sizeof(n)*2.5; while (nBits-- > 0) { bitsInReverse << (n & 1); n >>= 1; } std::string bits(bitsInReverse.str()); std::reverse(bits.begin(), bits.end()); return bits; } template<class T> BinStream& operator<<(T&& value) { os << value; return *this; } BinStream& operator<<(int value) { os << binario(value); return *this; } std::ostream& operator<<(std::ios_base& (__cdecl *_Pfn)(std::ios_base&)) { return os << _Pfn; } }; struct Bin { friend BinStream operator<<(std::ostream& os, const Bin& f); } bin; BinStream operator<<(std::ostream& os, const Bin& f) { return BinStream(os); } int main() { std::cout << "\n\t127 em binario: " << binario(127) << "\n\t127 em binario: " << bin << 127 << "\n\t127 em octal: " << std::oct << 127 << "\n\t127 em binario: " << bin << 127 << "\n\t127 em hexadecimal: " << std::hex << 127 << "\n\t127 em binario: " << bin << 127 << "\n\t127 em decimal: " << std::dec << 127 << "\n\t127 em binario: " << bin << 127 << "\n\n"; } |
December 15, 2017 Re: overload | ||||
---|---|---|---|---|
| ||||
Posted in reply to dark777 | On Thursday, 14 December 2017 at 22:47:15 UTC, dark777 wrote: > I know that this community is not from c ++, but for some time I studied how to do overload of ostream operators in c ++ and I even managed to get to this result, I got to this result in another post done here but I did not understand the that it returns this error below: > > > bin2.cxx:44:43: error: expected ‘,’ or ‘...’ before ‘(’ token > std::ostream& operator<<(std::ios_base& (__cdecl *_Pfn)(std::ios_base&)) > ^ > bin2.cxx: In member function ‘std::ostream& BinStream::operator<<(std::ios_base&)’: > bin2.cxx:46:16: error: ‘_Pfn’ was not declared in this scope > return os <<_Pfn; I expect it's confused by __cdecl. I just copied the function declaration from VS' iostreams, so it might be tainted by how VS does things. Removing __cdecl might work, or just add #define __cdecl __attribute__((__cdecl__)) A third option is to replace `std::ios_base& (__cdecl *Pfn)(std::ios_base&)` with `decltype(std::hex)& Pfn`. All of this said, I'd suggest finding a C++ forum to get answers to these questions. While I'm happy to help, it's not really the place for these discussions. -- Biotronic |
December 15, 2017 Re: overload | ||||
---|---|---|---|---|
| ||||
Posted in reply to Biotronic | On Friday, 15 December 2017 at 08:57:23 UTC, Biotronic wrote:
> On Thursday, 14 December 2017 at 22:47:15 UTC, dark777 wrote:
>> I know that this community is not from c ++, but for some time I studied how to do overload of ostream operators in c ++ and I even managed to get to this result, I got to this result in another post done here but I did not understand the that it returns this error below:
>>
>>
>> bin2.cxx:44:43: error: expected ‘,’ or ‘...’ before ‘(’ token
>> std::ostream& operator<<(std::ios_base& (__cdecl *_Pfn)(std::ios_base&))
>> ^
>> bin2.cxx: In member function ‘std::ostream& BinStream::operator<<(std::ios_base&)’:
>> bin2.cxx:46:16: error: ‘_Pfn’ was not declared in this scope
>> return os <<_Pfn;
>
> I expect it's confused by __cdecl. I just copied the function declaration from VS' iostreams, so it might be tainted by how VS does things. Removing __cdecl might work, or just add
> #define __cdecl __attribute__((__cdecl__))
> A third option is to replace `std::ios_base& (__cdecl *Pfn)(std::ios_base&)` with `decltype(std::hex)& Pfn`.
>
> All of this said, I'd suggest finding a C++ forum to get answers to these questions. While I'm happy to help, it's not really the place for these discussions.
>
> --
> Biotronic
I do not use windows I thought it was the standard of iostream ansi c++
|
Copyright © 1999-2021 by the D Language Foundation