【问题标题】:Passing initializer list to the inherited map将初始化列表传递给继承的映射
【发布时间】: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&lt;std::string, FileInfo&gt;;
  • @DeiDei 我不知道不建议扩展 STL 容器,现在我发现了主要原因:“他不公开继承 std::vector 的主要原因是没有 virtual析构函数“http://stackoverflow.com/a/4357417/4806882

标签: c++


【解决方案1】:

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

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

请注意,从 stl 容器继承不是一个好主意。

最好还是这样做:

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

【讨论】:

    猜你喜欢
    • 2015-08-03
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    相关资源
    最近更新 更多