2016-12-27 54 views
1

我试图初始化类FileList,延伸std::mapFileInfo对象与地图的特定初始化列表的集合,但我收到以下错误:传递初始化列表到继承的地图

Error C2440 'initializing': cannot convert from 'initializer list' to '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派生::容器。

+3

构造函数默认情况下不继承。查找继承构造函数。另外,请不要从std ::容器派生。它不会工作得很好。 – DeiDei

+1

如果你想让这个类型成为一个地图,你可以使用FileList = std :: map ;'。 –

+0

@DeiDei我不知道它不推荐扩展STL容器,现在我发现了主要原因:“他没有从std :: vector publicitly继承的主要原因是没有虚拟析构函数”[http:// stackoverflow.com/a/4357417/4806882](http://stackoverflow.com/a/4357417/4806882) –

回答

2

默认情况下,派生类中的构造方法不是从基类继承的,而是需要手动执行。

class FileList : public std::map<std::string, FileInfo> 
{ 
    using std::map<std::string, FileInfo>::map; 
}; 

请注意,从stl containters继承是不好的主意。

这是更好地只是做:

using FileList = std::map<std::string, FileInfo>;