2013-08-10 13 views
6

Mam problem podczas próby użycia std::map w brzękiem-3.3 i dzyń-3.0 na Ubuntu 12.04:Jak przekazać std :: map jako parametru domyślnego konstruktora w C++ funkcją klasy

#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; 
} 

Jednakże, podczas gdy kod kompiluje zarówno g++ i clang ciśgle te błędy jako wyjście:

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. 

najbliższy rzeczą mogłyby znaleźć pasujący mój problem polega na ten temat: How to pass std::map as a default constructor parameter

Ale nie mam pojęcia, co jest nie tak. Mam nadzieję, że ktoś może rzucić trochę światła na ten temat.

Aktualizacja:

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

jest w porządku. Dzięki.

+1

Looks jak http://llvm.org/bugs/show_bug.cgi?id=13657 - sugerowane obejście polega na umieszczeniu parensów wokół domyślnego argumentu, co powoduje, że jest on tutaj kompilowany. – Mat

Odpowiedz

1

Skompilowałem i uruchomiłem go pomyślnie w vs2012.
Więc myślę, że to problem kompilatorów.

+0

Dzięki. Przypuszczam, że to błąd clang, a także czekam na pomoc widelca. – xiaoyur347

+0

dlaczego używasz gcc? nigdy wcześniej nie widziałem klina! – BlackMamba

+0

Nie zapewnia to odpowiedzi na pytanie. Aby skrytykować lub poprosić o wyjaśnienie od autora, pozostaw komentarz pod swoim postem. –

1

Inne plakaty są poprawne, myślę, że jest to instancja Bug 13657, która powinna zostać naprawiona w Clang 3.4.

Jak wspomniano w raporcie błędów i C++ Standard Core Language Active Issues strona związana stamtąd (i jak wspomniano w aktualizacji), można obejść ten problem poprzez dodanie nawiasów do wartości domyślnej, co następuje:

void PrintMap(const std::map<std::string,std::string> &my_map 
    = (std::map<std::string,std::string>())) 
Powiązane problemy