Это не важно.Но мне любопытно, когда появится это предупреждение.Мой настоящий вопрос заключается в том, почему ostream и ofstream обрабатываются по-разному.
struct Test {
int y;
Test(int k) : y(k) {}
};
С этой простой структурой компилятор видит, что int
может быть преобразовано в Test
.
Поэтому я получаю предупреждение с этим кодом:
std :: ofstream& operator<< (std :: ofstream& os, const Test& t)
{
os << t.y;
return os;
}
Когда он видит os << t.y
, он не знает, хочу ли я нажать int с именем ty, или я хочусначала преобразовать int в тест, а затем нажать его.Это кажется довольно странным, можно подумать, что он предпочел бы неконвертированную перегрузку int 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&)
* 1017В любом случае, один из способов решения этой проблемы - пометить конструктор в Test как
explicit
.Я могу жить с этим.Но странная вещь в том, что если
ofstream
заменить на
ostream
, то предупреждение исчезнет.Есть идеи почему?