This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: c++/8567: std::endl is of unknown type when overloading operator<< (repeat in case attachment didnt work)
- From: bangerth at dealii dot org
- To: gcc-bugs at gcc dot gnu dot org, gcc-prs at gcc dot gnu dot org, jstanek at iastate dot edu, jstanek at vrac dot iastate dot edu, nobody at gcc dot gnu dot org
- Date: 14 Nov 2002 23:37:17 -0000
- Subject: Re: c++/8567: std::endl is of unknown type when overloading operator<< (repeat in case attachment didnt work)
- Reply-to: bangerth at dealii dot org, gcc-bugs at gcc dot gnu dot org, gcc-prs at gcc dot gnu dot org, jstanek at iastate dot edu, jstanek at vrac dot iastate dot edu, nobody at gcc dot gnu dot org, gcc-gnats at gcc dot gnu dot org
Synopsis: std::endl is of unknown type when overloading operator<< (repeat in case attachment didnt work)
State-Changed-From-To: open->closed
State-Changed-By: bangerth
State-Changed-When: Thu Nov 14 15:37:17 2002
State-Changed-Why:
Not a bug. Basically, it is this:
---------------------------------
namespace std {
template <typename T> T& endl (T&);
};
class BlackHole{};
template <typename T> BlackHole& operator<<(BlackHole& bh, const T& dummy);
template <typename T> BlackHole& operator<<(BlackHole& bh, T& (*dummy)(T&));
int main() {
BlackHole bh;
bh << std::endl;
}
-------------------------------
Since there is no unambiguous function std::endl, the
compiler cannot know which one to take as argument, so
you have to disambiguate the situation by passing it the
exact template argument list. Alternatively, you can give
an overloaded non-template op<<; in this example, this
would do:
BlackHole& operator<<(BlackHole& bh, int& (*dummy)(int&));
Then std::endl<int> would be taken.
W.
http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=8567