OK, tôi sẽ chỉ đăng chương trình hoàn chỉnh mặc dù nó có nội dung không liên quan và mã được đề cập là mã chết & hellip;Tại sao không cần trình độ chuyên môn?
#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;
}
Điều này biên dịch tốt với MSVC và g ++. Nhưng trong lớp học InFStream
, tại sao tôi không cần phải đủ điều kiện ios_base
? Hoặc, cùng một câu hỏi thực sự, tại sao tôi cần sử dụng tiêu chuẩn std::
của ifstream
trong danh sách khởi tạo bộ dựng?
Vì 'ifstream' nằm trong không gian tên std? Tại sao bạn nghĩ rằng bạn không cần phải sử dụng nó? –
@VJo: 'ios_base' cũng nằm trong không gian tên' std'. Về lý do tại sao tôi nghĩ rằng các trình biên dịch tôi đề cập đến biên dịch mã này tốt, đó là bởi vì họ làm. Heh. –
Có thể vì lớp InFStream của bạn kế thừa từ std :: ifstream mà lần lượt kế thừa từ std :: ios_base. Vì vậy, tất cả các liệt kê ios_base là thành viên của lớp học của bạn thông qua kế thừa và không cần đủ điều kiện. – Praetorian