Как написать оператор `<<` для boost :: tuple?

В приведенном ниже примере кода показано, что boost :: tuple может быть неявно создан из первого аргумента шаблона. Из-за этого я не могу написать оператор << , так как он становится неоднозначным.

Также я не понимаю, почему ostringstream & << float также неоднозначен. Это не имеет неявной конструкции. Почему это также дает неоднозначную ошибку?

#include <iostream>
#include <boost/tuple/tuple.hpp>
#include <sstream>
#include <string>

using namespace std;

class Myclass
{
};

typedef boost::tuple<int,float,Myclass> Mytuple;

ostringstream& operator<<(ostringstream& os_, Mytuple tuple_)
{
  float f = tuple_.get<1>();
  //os_ << (int)tuple_.get<0>(); // Error because int is implicitly converted into Mytuple. WHYY?
  //os_ << tuple_.get<1>();      // No Clue Why this is ambiguous.
  //os_ << tuple_.get<2>();      // Error because no matching operator. Fine.
  return os_;
}

int main()
{
  Mytuple t1;
  t1 = 3;      // Working because int is implicitly converted into Mytuple!! WHY?
  //t1 = 3.0f; // Error because no matching constructor. Fine.
  return 0;
}

Error Mesasge:

tupleTest2.C: 18: error: ISO C ++ говорит, что они неоднозначны, даже , хотя худшее преобразование для первого лучше, чем для первого. худшее преобразование для второго:

5
задан balki 29 September 2011 в 07:09
поделиться