2013-08-10 23 views
6

Tôi có một vấn đề khi cố gắng sử dụng std::map trong vang-3.3 và Clang-3.0 trên Ubuntu 12.04:Làm thế nào để vượt qua std :: bản đồ như một tham số constructor mặc định trong C++ chức năng lớp

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

Tuy nhiên, trong khi mã biên dịch trong cả g++clang tôi tiếp tục nhận được các lỗi như đầu ra:

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. 

điều gần nhất tôi có thể thấy rằng phù hợp với vấn đề của tôi là chủ đề này: How to pass std::map as a default constructor parameter

Nhưng, tôi không biết có gì sai. Hy vọng rằng, ai đó có thể làm sáng tỏ điều này.

Cập nhật:

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

là ok. Cảm ơn.

+1

vẻ như http://llvm.org/bugs/show_bug.cgi?id=13657 - giải pháp được đề xuất là đặt parens xung quanh đối số mặc định, làm cho nó biên dịch ở đây. – Mat

Trả lời

1

Tôi đã biên dịch và chạy thành công trong năm2012.
Vì vậy, tôi nghĩ rằng đó là vấn đề trình biên dịch.

+0

Cảm ơn. Tôi đoán đó là lỗi clang, và tôi cũng đang chờ sự giúp đỡ của clang. – xiaoyur347

+0

tại sao bạn sử dụng gcc? tôi chưa bao giờ thấy tiếng kêu trước đây! – BlackMamba

+0

Điều này không cung cấp câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ tác giả, hãy để lại nhận xét bên dưới bài đăng của họ. –

1

Các áp phích khác là chính xác, tôi nghĩ đây là một ví dụ của Bug 13657 cần được sửa trong Clang 3.4.

Như đã đề cập trong báo cáo lỗi và trang C++ Standard Core Language Active Issues liên kết từ đó (và như bạn đề cập đến trong bản cập nhật của bạn), bạn có thể làm việc xung quanh vấn đề này bằng cách thêm dấu ngoặc đơn với giá trị mặc định như sau:

void PrintMap(const std::map<std::string,std::string> &my_map 
    = (std::map<std::string,std::string>())) 
Các vấn đề liên quan