C++ 初始化基类

C++ 初始化基类,c++,C++,据我所知,这应该行得通,不是吗 struct ViewOfFile { void* p = nullptr; ViewOfFile(HANDLE hMap, int64_t OffsetB, SIZE_T SizeB, bool WriteAccess) { DWORD ViewAccessMode = FILE_MAP_READ | (WriteAccess ? FILE_MAP_WRITE : NULL); LARGE_INTEGER LI

据我所知,这应该行得通,不是吗

struct ViewOfFile {
    void* p = nullptr;

    ViewOfFile(HANDLE hMap, int64_t OffsetB, SIZE_T SizeB, bool WriteAccess) {
        DWORD ViewAccessMode = FILE_MAP_READ | (WriteAccess ? FILE_MAP_WRITE : NULL);
        LARGE_INTEGER LI = { OffsetB };
        p = MapViewOfFile(hMap, ViewAccessMode, LI.HighPart, LI.LowPart, SizeB);
        if (p == nullptr) throw Exception("ViewOfFile: Failed to create view.");
    }
    ~ViewOfFile() {
        if (p) UnmapViewOfFile(p);
    }
    operator void*() const { return p; }
    operator char*() const { return reinterpret_cast<char*>(p); }
};

template <typename T>
struct ViewOfFileAs : ViewOfFile {
    T* as;
    ViewOfFile(HANDLE hMap, int64_t OffsetB, SIZE_T SizeB, bool WriteAccess) : ViewOfFile(hMap, OffsetB, SizeB, WriteAccess) {
        as = reinterpret_cast<T*>(p);
    }
};
结构视图文件{
void*p=nullptr;
视图文件(句柄hMap、int64\t OffsetB、大小SizeB、bool WriteAccess){
DWORD VIEWACCESS MODE=文件映射读取(WriteAccess?文件映射写入:NULL);
大整数LI={OffsetB};
p=MapViewOfFile(hMap、ViewAccessMode、LI.HighPart、LI.LowPart、SizeB);
if(p==nullptr)抛出异常(“ViewOfFile:未能创建视图”);
}
~ViewOfFile(){
如果(p)未提交文件(p);
}
运算符void*()常量{return p;}
运算符char*()常量{return reinterpret_cast(p);}
};
模板
结构ViewOffiles:ViewOfFile{
T*as;
ViewOfFile(句柄hMap、int64\t OffsetB、大小SizeB、bool WriteAccess):ViewOfFile(句柄hMap、OffsetB、大小SizeB、WriteAccess){
as=重新解释铸件(p);
}
};

但是,模板类构造函数给了我一个错误“只有构造函数才能有基/成员初始值设定项列表”。为什么会发生这种情况?

我想你只是在模板结构的定义上有一个输入错误:你编写了
ViewOfFile
,而不是作为构造函数编写了
viewoffiles

ViewOfFile(HANDLE hMap, int64_t OffsetB, SIZE_T SizeB, bool WriteAccess) 
应该是

ViewOfFileAs(HANDLE hMap, int64_t OffsetB, SIZE_T SizeB, bool WriteAccess) 

不相关,但为什么要使用
NULL
宏写入整数值?您可能希望将模板构造函数从ViewOfFile重命名为ViewOfFileAs@NeilKirk因为它应该是0,和另一个宏一样是紫色的,它的一个时尚Couebjar Stroustrup多次说过,在一个正确的C++程序中没有任何理由使用NULL。“时尚选择”的确如此。