2016-01-10 16 views
15

To prawdopodobnie ma bardzo prostą odpowiedź, ale naprawdę nie mogę tego rozgryźć. Dlaczego dostaję błędy, aby to zrobić? Jaki jest właściwy sposób inicjowania czegoś takiego?Inicjalizuj std :: tablica krotek z nawiasami klamrowymi

std::array<std::tuple<int, std::string>, 3> tuples{ 
    {3, "a"}, 
    {7, "b"}, 
    {2, "c"} 
}; 

Na MSVC 2015, otrzymuję następujące błędy:

No suitable constructor exists to convert from "int" to "std::tuple<int, std::string>" 
No suitable constructor exists to convert from "const char[2]" to "std::tuple<int, std::string>" 

Odpowiedz

24

Jest wybitnym problem z tuple. Zobacz, its constructor in C++11/14 is explicit. I dlatego nie może uczestniczyć w inicjowaniu listy kopii, co robią wewnętrzne listy "usztywnionych-inicjujących" (te zewnętrzne są bezpośrednią inicjacją listy).

Pomysł był prevent you from being able to bypass a class's explicit constructors through tuple. Ale w C++ 17 zostanie to zmienione: jeśli wszystkie typy krotek są niejawnie wymienialne z danego danego typu, to tak samo będzie ten konstruktor z tuple.

Dla konkretnego przypadku użycia można użyć std :: pair. Jego konstruktorem nigdy nie jest explicit.

+1

Dlatego właśnie usunięta odpowiedź drugiego faceta zadziałała, zanim opublikowałem. Myślałem, że mógłbym robić coś innego, czego się nie spodziewałem. Chyba będę musiał użyć tablicy C lub po prostu zrobić to w ten sposób. Ugh ... C++ 17 nie może nadejść wystarczająco szybko. – Alex

+1

@AlexYan: Możesz użyć 'pair', ponieważ twój obecny typ ma tylko dwóch członków. –

+1

'std :: make_tuple' również działa. (nie wiedział dlaczego) – edmz

Powiązane problemy