Trong mã mẫu bên dưới, nó cho thấy rằng tăng :: tuple có thể được tạo ra ngầm từ đối số mẫu đầu tiên. Do đó tôi không thể viết một toán tử <<
vì nó trở nên mơ hồ.Cách viết toán tử `<<` cho boost :: tuple?
Ngoài ra tôi không hiểu tại sao ostringstream& << float
cũng không rõ ràng. Điều này không có bất kỳ công trình ngầm nào. Tại sao điều này cũng cung cấp cho lỗi mơ hồ?
#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;
}
Lỗi 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' đã có một toán tử' 'giống như vậy. Tôi không thấy làm thế nào mà dẫn đến các lỗi bạn đang nhận được nhưng nó có thể có liên quan. –
Cũng 'boost :: tuple' có các hàm tạo cho 0..n của các phần tử tuple, do đó, bạn có một hàm tạo' Mytuple (int) ', nó làm cho nó có thể chuyển đổi từ' int'. –
Nó biên dịch tốt cho tôi - có thể là - với thử nghiệm gcc 4.5 và gcc 4.7. Bạn đang sử dụng phiên bản trình biên dịch nào? – rodrigo