предупреждение о неоднозначности для ofstream, но не для ostream. В чем разница?

Это не важно. Но мне любопытно, когда появится это предупреждение. Мой настоящий вопрос в том, почему к 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 , то предупреждение исчезнет. Есть идеи, почему?

7
задан Aaron McDaid 19 December 2011 в 16:24
поделиться