ठीक है, मैं सिर्फ पूरा प्रोग्राम पोस्ट करूंगा, भले ही इसमें अतिरिक्त सामान हो और प्रश्न में कोड मृत कोड और नरकिप है;कोई योग्यता क्यों आवश्यक नहीं है?
#include <iostream>
#include <fstream>
namespace detail {
// Solution by Johannes Schaub alias litb
// http://groups.google.com/group/comp.std.c++/browse_thread/thread/b567617bfccabcad
template<int> struct D {};
typedef char yes[1];
typedef char no[2];
template< class T, class U >
yes& f(int, D< sizeof T(*(U*)0) >* = 0);
template< class T, class U >
no& f(...);
template< class To, class From >
struct IsExplicitlyConvertible
{
enum{ yes = (sizeof detail::f< To, From >(0) == sizeof(detail::yes)) };
};
bool const streamsSupportWindows =
IsExplicitlyConvertible< std::ofstream, wchar_t const* >::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 << (detail::streamsSupportWindows
? "Windows-enabled"
: "Ach, no Windows support"
) << endl;
}
यह एमएसवीसी और जी ++ के साथ ठीक संकलित करता है। लेकिन InFStream
कक्षा में, मुझे ios_base
योग्यता प्राप्त करने की आवश्यकता क्यों नहीं है? या, एक ही सवाल वास्तव में, मुझे std::
कन्स्ट्रक्टर प्रारंभकर्ता सूची में ifstream
की योग्यता का उपयोग करने की आवश्यकता क्यों है?
क्योंकि 'ifstream' एसटीडी नाम स्थान में है? आपको ऐसा क्यों लगता है कि आपको इसका इस्तेमाल करने की आवश्यकता नहीं है? –
@VJo: 'ios_base'' std' नेमस्पेस में भी है। मुझे क्यों लगता है कि मैं जिन कंपाइलर्स का उल्लेख करता हूं, वे इस कोड को ठीक से संकलित करते हैं, ऐसा इसलिए है क्योंकि वे करते हैं। हे। –
संभवतः क्योंकि आपकी इनफस्ट्रीम क्लास std :: ifstream से प्राप्त होती है जो बदले में std :: ios_base से विरासत में होती है। इसलिए सभी ios_base गणनाएं आपके वर्ग के सदस्य विरासत के माध्यम से हैं और पूर्ण योग्यता की आवश्यकता नहीं है। – Praetorian