2017-05-05 17 views
15

Tôi có đoạn mã sau:GCC từ chối danh sách khởi động của tham số

#include <initializer_list> 
#include <utility> 

enum class Classification 
{ 
    Unspecified, 
    Primary, 
    Secondary 
}; 

class ClassificationMap 
{ 
public: 
    ClassificationMap(std::initializer_list<std::pair<const Classification, int>> content = {}); 
}; 

void foo(ClassificationMap) {} 

int main() 
{ 
    foo({{Classification::Unspecified, 42}}); 
} 

Visual Studio 2013 & năm 2017 và Clang 3.4.1 (trở lên) cả biên dịch mã tốt. Từ POV của tôi, nó cũng sẽ ổn thôi. Tuy nhiên, GCC 5.1 từ chối để biên dịch nó, với các lỗi sau:

<source>: In function 'int main()': 
<source>:22:44: error: could not convert '{{Unspecified, 42}}' from '<brace-enclosed initializer list>' to 'ClassificationMap' 
    foo({{Classification::Unspecified, 42}}); 

[Live example]

(Tôi đang đi qua các tiêu chuẩn cờ đúng (-std=c++11) cho cả GCC và Clang).

Có sự cố trong mã của tôi hay đây thực sự là lỗi GCC không?


thông tin bổ sung: trong mã thật của tôi, danh sách initialiser được sử dụng để khởi tạo một thành viên đồ có thứ tự của lớp ClassificationMap (đó là lý do tại sao loại của nó là nó là gì). Tôi cần mã để làm việc trong VS2013 & GCC 5.1

+3

Việc thêm một tập hợp '{}' khác làm cho nó hoạt động. Thực sự rất lạ ... – InternetAussie

+3

Ngoài ra, loại bỏ '= {}' trong 'ClassificationMap (std :: initializer_list > content = {})' nhận nó để biên dịch trong g ++ – NathanOliver

+0

@NathanOliver Cảm ơn, đó là một mẹo tuyệt vời. Tôi sẽ sử dụng điều này như một giải pháp thay thế trong mã của tôi. Tôi vẫn sẽ quan tâm đến ai đang gặp lỗi ở đây, tôi hay GCC. – Angew

Trả lời

0

Dưới đây là một cách giải quyết tốt cho vấn đề này (bỏ giá trị mặc định):

class ClassificationMap 
{ 
public: 
    ClassificationMap(std::initializer_list<std::pair<const Classification, int>> content); 
    ClassificationMap() : ClassificationMap({}) {} 

}; 

Bạn sẽ có hành vi chính xác mà bạn muốn và nó biên dịch ở khắp mọi nơi.

https://godbolt.org/g/WUuMzP

Các vấn đề liên quan