glen <[EMAIL PROTECTED]> writes:

>       - I provided an example.  It wasn't minimal enough for you?

The problem isn't that the example is not minimal.

The problem is that the example is incomplete. I.e. I can't cut/paste
that example and observe the same error.

It is simple enough to add missing '#include's, to make it complete,
but why are you making *me* work? You should have done that (minimal)
work yourself.

> Let me try again

There is no reason to try again.
You have already been given *the* answer, but you didn't understand it :-(

The answer (from Ulrich Eckhardt) is:

>> Well, anyways, your operator's signature matches _EVERYTHING_, including a
>> character literal.

Let me try to explain that answer for you.

>   template<typename C>
>   std::ostream& operator<< (std::ostream& op, const C& cpi )

The problem is that this template function will match *anything*.
It will be a match for:

    std::cout << 1;           // C == "const int"
    std::cout << 'a';         // C == "char"
    std::cout << "abc";       // C == "const char[4]"
    .... etc ...

So it makes all the *standard* "std::operator<<(...)" ambigous,
and compiler tells you exactly that -- that it's "standard"

  std::ostream::operator<<(long int)
  std::ostream::operator<<(long unsigned int)
  std::ostream::operator<<(bool)
  std::ostream::operator<<(short int)
  ... etc ...

have been ambigously overloaded (by you), and compiler now doesn't
know which of these possible overloads it's supposed to call.

I don't see any way to overload ostream::operator<<() such that it 
will output arbitrary container, but will not ambiguate standard
overloads. 

I think you'll just have to rewrite offending code. Instead of

   cout << myRange;

you'll have to do:

   print(cout, myRange.begin(), myRange.end()); // [1]
or
   myRange.print(cout); // [2]

For [1], it is trivial to define 

  // warning: untested
  template <typename C> std::ostream& 
  print(std::ostream&, 
        typename C::const_iterator first, 
        typename C::const_iterator last) { ... }

For [2], just define appropriate "print" method in the Range class.

Cheers,
-- 
In order to understand recursion you must first understand recursion.
Remove /-nsp/ for email.
_______________________________________________
help-gplusplus mailing list
help-gplusplus@gnu.org
http://lists.gnu.org/mailman/listinfo/help-gplusplus

Reply via email to