2016-12-27 55 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>;