How to pass std::map as a default constructor parameter in c++ class function

て烟熏妆下的殇ゞ 提交于 2019-12-10 13:40:25

问题


I have a problem when attempting to use std::map in clang-3.3 and clang-3.0 on Ubuntu 12.04:

#include <iostream>
#include <map>
#include <string>

class A
{
public:
#if 0 //clang compiles ok
    typedef std::map<std::string,std::string> MapKeyValue_t;
    void PrintMap(const MapKeyValue_t &my_map 
        = MapKeyValue_t())
#else // clang compiles fail
    void PrintMap(const std::map<std::string,std::string> &my_map 
    = std::map<std::string,std::string>())
#endif
{
    std::map<std::string,std::string>::const_iterator it;
    for (it = my_map.begin(); it != my_map.end(); it++)
    {
        std::cout << it->first << " " << it->second << std::endl;
    }
}
};

int main()
{
    A a;
    a.PrintMap();
    return 0;
}

However, while the code compiles in both g++ and clang I keep getting these errors as output:

test.cpp:14:36: error: expected ')'
        = std::map<std::string,std::string>())
                                          ^
test.cpp:13:15: note: to match this '('
        void PrintMap(const std::map<std::string,std::string> &my_map 
                     ^
test.cpp:14:24: error: expected '>'
        = std::map<std::string,std::string>())
                              ^
test.cpp:28:13: error: too few arguments to function call, expected 2, have 0
        a.PrintMap();
        ~~~~~~~~~~ ^
test.cpp:13:2: note: 'PrintMap' declared here
        void PrintMap(const std::map<std::string,std::string> &my_map 
        ^
3 errors generated.

The closest thing I could find that matches my problem is this topic: How to pass std::map as a default constructor parameter

But, I have no idea what's wrong. Hopefully, someone can shed some light on this, please.

Update:

void PrintMap(const std::map<std::string,std::string> &my_map 
        = (std::map<std::string,std::string>()))

is ok. Thanks.


回答1:


I compiled and run it successfully in vs2012.
So I think it's compilers problem.




回答2:


The other posters are correct, I think this is an instance of Bug 13657 which should be fixed in Clang 3.4.

As mentioned in the bug report and the C++ Standard Core Language Active Issues page linked from there (and as you mentioned in your update), you can work around the issue by adding parentheses to the default value as follows:

void PrintMap(const std::map<std::string,std::string> &my_map 
    = (std::map<std::string,std::string>()))


来源:https://stackoverflow.com/questions/18160678/how-to-pass-stdmap-as-a-default-constructor-parameter-in-c-class-function

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!