Điều này không quan trọng. Nhưng tôi rất tò mò khi cảnh báo này xuất hiện. Câu hỏi thực sự của tôi là tại sao ostream và ofstream lại được đối xử khác nhau.cảnh báo về sự mơ hồ đối với dòng suối, nhưng không cảnh báo về luồng xương. Có gì khác biệt?
struct Test {
int y;
Test(int k) : y(k) {}
};
Với struct đơn giản này, trình biên dịch thấy rằng một int
có thể được chuyển đổi sang một Test
.
Do đó, tôi nhận được một cảnh báo với mã này:
std :: ofstream& operator<< (std :: ofstream& os, const Test& t)
{
os << t.y;
return os;
}
Khi nó thấy os << t.y
nó không biết liệu tôi có muốn đẩy int gọi là ty, hoặc cho dù tôi muốn chuyển đổi int để một Kiểm tra trước và sau đó đẩy nó. Điều này có vẻ khá kỳ lạ, bạn nghĩ rằng nó muốn không quá tải int chuyển đổi ofstream& operator<< (ofstream &os, int)
.
g ++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3:
template_expl.cpp: In function ‘std::ofstream& operator<<(std::ofstream&, const Test&)’:
template_expl.cpp:15: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
/usr/include/c++/4.4/bits/ostream.tcc:105: note: candidate 1: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]
template_expl.cpp:13: note: candidate 2: std::ofstream& operator<<(std::ofstream&, const Test&)
Dù sao, có một cách để giải quyết này là để đánh dấu các nhà xây dựng trong thử nghiệm như explicit
. Tôi có thể sống với điều đó. Nhưng điều kỳ lạ là nếu ofstream
được thay thế bằng ostream
, thì cảnh báo sẽ biến mất. Bất kỳ ý tưởng tại sao?
Điều đó có ý nghĩa rất nhiều.Nhưng cho rằng thừa kế của dòng chảy từ ostream, bạn sẽ nghĩ rằng một chuyển đổi như vậy sẽ tự nhiên hơn rất nhiều. ofstream thừa kế 'operator << (int)' từ ostream. Tôi đã nghĩ rằng một diễn viên như vậy sẽ rất được ưa thích bởi tiêu chuẩn. –