1. /* requestData.h */
    2. class MimeType
    3. {
    4. private:
    5. // static pthread_mutex_t lock;
    6. static void init();
    7. static std::unordered_map<std::string, std::string> mime;
    8. MimeType();
    9. MimeType(const MimeType &m);
    10. public:
    11. static std::string getMime(const std::string &suffix);
    12. private:
    13. static std::once_flag init_flag; /* 此处为声明,并未定义 */
    14. };
    15. /* requestData.cpp */
    16. std::string MimeType::getMime(const std::string& suffix) {
    17. std::call_once(init_flag,init);
    18. if (mime.find(suffix) == mime.end())
    19. return mime["default"];
    20. else
    21. return mime[suffix];
    22. }

    解释:在CPP文件中无法找到init_flag的定义,因头文件中不对init_flag分配内存,故可在cpp文件中声明该对象,即可解决bug,

    1. std::once_flag MimeType::init_flag; /* 定义 */
    2. std::string MimeType::getMime(const std::string& suffix) {
    3. std::call_once(init_flag,init);
    4. if (mime.find(suffix) == mime.end())
    5. return mime["default"];
    6. else
    7. return mime[suffix];
    8. }