这是怎么回事:
struct FileListItem {
string sOriginalFn;
time_t ttTimeTaken;
FileListItem(){}
FileListItem(string _sOriginalFn, time_t _ttTimeTaken) :
sOriginalFn (_sOriginalFn), ttTimeTaken (_ttTimeTaken) { }
};
struct FileList : vector<FileListItem> {
int iCurItm;
FileList() : vector(), iCurItm(-1) {};
void Add(string _sOriginalFn, time_t _ttTimeTaken) {
push_back(FileListItem(_sOriginalFn, _ttTimeTaken));
}
}
第一次调用"read access violation"
时得到运行时Add
。
然后我尝试:
struct FileList : vector<FileListItem> {
int iCurItm;
FileList() : vector(), iCurItm(-1) {};
FileListItem Itm; // <--- new member
void Add(string _sOriginalFn, time_t _ttTimeTaken) {
Itm(_sOriginalFn, _ttTimeTaken); // <--- E0980 pointing to "Itm"
push_back(Itm);
}
}
并获得编译时错误:
E0980 - call of an object of a class type without appropriate operator() or conversion functions to pointer-to-function type.
自从30年前Borland C ++成立时停止编程以来,我肯定已经忘记或错过了一些东西。
答案 0 :(得分:3)
在线
Itm(_sOriginalFn, _ttTimeTaken);
您没有在为对象调用构造函数。相反,编译器将此解释为对函子Itm
的函数调用。因此,它尝试为给定的参数找到有效的operator()
,但无济于事。
除了...之外,不要在其他地方使用构造函数成员初始化器列表语法。相反,您要做的就是为您的成员分配一个新对象。
那么,您永远都不想从std
容器继承。他们的破坏者不是虚构的,所以您使自己陷入痛苦的境界...
使用合成或键入别名:
struct FileList {
std::vector<FileListItem> flist;
int curItem;
FileList() : flist(), curItem(-1) {}
void Add(string const& _sOriginalFn, time_t _ttTimeTaken) {
// No need to construct the object before, let vector handle it
flist.emplace_back(_sOriginalFn, _ttTimeTaken);
};
关于读取访问冲突,从我看到的代码来看,没有任何解释。可能是与代码中某处curItem
相关的某些访问权限未在此处显示吗?