Tamam, fazladan bir şey olsa bile tam bir program yayınlayacağım ve söz konusu kod ölü kod ve hellip;Neden bir yeterlilik gerekli değil?
#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;
}
Bu, MSVC ve g ++ ile iyi bir şekilde derlenir. Fakat InFStream
sınıfında, neden ios_base
'u nitelendirmem gerekmiyor? Ya da, aynı soru, neden yapıcı başlatıcı listesinde ifstream
std::
kalifikasyonunu kullanmam gerekiyor?
ifstream' std ad olan 'için? Neden onu kullanmanıza gerek olmadığını düşünüyorsunuz? –
@ VJo: 'ios_base' ayrıca' std' ad alanındadır. Neden bu derleme derim ki derler ki bu kodu derler, çünkü onlar yaparlar. Heh. –
Muhtemelen, InFStream sınıfınız std :: ios_base'den miras alınan std :: ifstream'den miras aldığından. Bu nedenle, tüm ios_base numaralandırmaları, sınıfınızın miras yoluyla üyedir ve tam bir kalifikasyona ihtiyaç duymaz. – Praetorian