将初始化列表传递给继承的地图

时间:2016-12-27 09:15:35

标签: c++

我正在尝试初始化类FileList,它将std::map扩展为具有地图特定初始值设定项列表的FileInfo对象的集合,但我收到以下错误:

  

错误C2440'初始化':无法转换为'初始化列表'到' 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

是否有可能将初始值设定项列表传递给std::map继承的FileList,而无需手动插入每个对象,如下所示?

FileList fileList;
fileList[f1()] = f1;
fileList[f2()] = f2;

编辑:

正如@DeiDei所说,不建议从std :: container派生。

1 个答案:

答案 0 :(得分:2)

派生类中的构造函数不会从基类继承,默认情况下需要手动执行。

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

请注意,从stl包含中继承它不是一个好主意。

最好这样做:

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