【发布时间】:2016-12-27 09:15:34
【问题描述】:
我正在尝试初始化类 FileList,它将 std::map 扩展为具有映射特定初始化程序列表的 FileInfo 对象的集合,但我收到以下错误:
错误 C2440 'initializing':无法从 'initializer list' 转换为 'FileList'
#include <string>
#include <map>
class FileInfo
{
public:
FileInfo(const std::string &name) : mName(name) { }
std::string operator () () const
{
return mName;
}
private:
std::string mName;
};
class FileList : public std::map<std::string, FileInfo> { };
int main(int argc, char *argv[])
{
FileInfo f1 = { "f1" };
FileInfo f2 = { "f2" };
FileList fileList{ { f1(), f1 }, { f2(), f2 } };
return 0;
}
鉴于FileList 正是std::map,我不知道为什么会失败。
是否可以将初始化列表传递给FileList 继承的std::map,而无需像下面那样手动插入每个对象?
FileList fileList;
fileList[f1()] = f1;
fileList[f2()] = f2;
编辑:
正如@DeiDei 所说,不建议从 std::container 派生。
【问题讨论】:
-
默认情况下不继承构造函数。查找继承构造函数。另外,请不要从 std::container 派生。这不会很好。
-
如果你希望类型是完全地图,你可以
using FileList = std::map<std::string, FileInfo>;。 -
@DeiDei 我不知道不建议扩展 STL 容器,现在我发现了主要原因:“他不公开继承 std::vector 的主要原因是没有 virtual析构函数“http://stackoverflow.com/a/4357417/4806882
标签: c++