Why is no qualification necessary?
<p>OK, I'll just post the complete program even though it has extraneous stuff and the code in question is the dead code&hellip;</p>

<pre><code>#include &lt;iostream&gt;
#include &lt;fstream&gt;

namespace detail {
    // Solution by Johannes Schaub alias litb
    // http://groups.google.com/group/comp.std.c++/browse_thread/thread/b567617bfccabcad
    template&lt;int&gt; struct D {};
    typedef char yes[1];
    typedef char no[2];

    template&lt; class T, class U &gt;
    yes&amp; f( int, D&lt; sizeof T(*(U*)0) &gt;* = 0 );

    template&lt; class T, class U &gt;
    no&amp; f( ... );

    template&lt; class To, class From &gt;
    struct IsExplicitlyConvertible
    {
        enum{ yes = (sizeof detail::f&lt; To, From &gt;(0) == sizeof( detail::yes ) ) };
    };

    bool const streamsSupportWindows =
        IsExplicitlyConvertible&lt; std::ofstream, wchar_t const* &gt;::yes;
}

class InFStream
    : public std::ifstream
{
    public:
        InFStream() {}
        explicit InFStream(
            char const* filename,
            ios_base::openmode mode = ios_base::in | ios_base::out
            )
            : std::ifstream( filename, mode )
        {}
};

int main()
{
    using namespace std;
    cout &lt;&lt; (detail::streamsSupportWindows
        ? "Windows-enabled"
        : "Ach, no Windows support"
        ) &lt;&lt; endl;
}
</code></pre>

<p>This compiles fine with MSVC and g++. But in the <code>InFStream</code> class, why do I not need to qualify <code>ios_base</code>? Or, same question really, why do I need to use <code>std::</code> qualification of <code>ifstream</code> in the constructor initializer list?</p>
