Nel seguente codice di esempio, viene mostrato che boost :: tuple può essere creato implicitamente dal primo argomento del modello. Per questo motivo non sono in grado di scrivere un operatore <<
poiché diventa ambiguo.Come scrivere un operatore << << `per boost :: tuple?
Anche io non capisco perché ostringstream& << float
è anche ambiguo. Questo non ha alcuna costruzione implicita. Perché questo dà anche un errore ambiguo?
#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;
}
Errore Mesasge:
tupleTest2.C:18: error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
'boost :: tuple' ha già un operatore' 'molto simile. Non vedo come ciò porti agli errori che stai ricevendo, ma potrebbe essere correlato. –
Anche 'boost :: tuple' ha costruttori per 0..n degli elementi tuple, quindi il tuo ha un costruttore' Mytuple (int) 'che lo rende convertibile da' int'. –
Compila per me, come dovrebbe, con gcc 4.5 e gcc 4.7 experimental. Quale versione del compilatore stai usando? – rodrigo