Это не важно. Но мне любопытно, когда появится это предупреждение. Мой настоящий вопрос в том, почему к ostream и ostream относятся по-разному.
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 << ty
, он не знает, хочу ли я вставить int с именем ty или хочу преобразовать int сначала в Test, а затем нажмите на него. Это кажется довольно странным, можно подумать, что он предпочел бы непреобразованную перегрузку 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&)
В любом случае, один из способов решить эту проблему - пометить конструктор в Test как явный
. Я могу жить с этим. Но странно то, что если ofstream
заменить на ostream
, то предупреждение исчезнет. Есть идеи, почему?