C ++调用构造函数初始化对象会产生错误

时间:2018-08-06 07:19:50

标签: c++ constructor

这是怎么回事:

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 ++成立时停止编程以来,我肯定已经忘记或错过了一些东西。

1 个答案:

答案 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相关的某些访问权限未在此处显示吗?