How to pass std::map as a default constructor para

2019-06-20 07:58发布

问题:

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>()))


标签: c++ clang stdmap