2016-12-01 2 views
1

Я не понимаю, почему следующий код не компилируется из-за «плохого» использования emplace_back. Не могли бы вы рассказать мне, что с ним не так, и какое обходное решение я мог бы использовать?emplace_back on std :: vector

#include <vector> 

class Test { 
private: 
    std::size_t n_; 
    std::vector<double> a_; 
    std::vector<double> b_; 

public: 
    Test(std::size_t n, std::initializer_list<std::size_t> list) 
     : n_(n), a_(list.begin()[0]), b_(list.begin()[1]){}; 
}; 

int main() { 
    Test t{5, {3, 4}}; 

    std::vector<Test> v; 
    v.emplace_back(5, {3, 4}); 

    return 0; 
} 
+0

использовать v.emplace_back (Test (5, {3, 4})); для добавления объекта Test к вектору – berendeanicolae

+0

[OT]: если список инициализаторов должен быть всегда размером 2, рассмотрите возможность использования 'std :: array ' или замените на два параметра: –

+0

@piotr: этот код, очевидно, является реальным кодом. Я сделал это проще, чем это было, и я согласен, что это выглядит глупо. – InsideLoop

ответ

5

{3, 4} не имеют типа здесь, таким образом, вы должны явно указать, что вы используете инициализатор-список, как это:

v.emplace_back(5, std::initializer_list<std::size_t>{3, 4}); 
+2

'{3,4}' * * * имеет тип. Это просто 'std :: initializer_list ', а не обязательный 'std :: initializer_list '. –

+0

Я озадачен, почему он не имеет типа здесь и почему он имеет его, когда я напрямую конструирую Test t. – InsideLoop

+0

@MartinBonner Я попытался изменить конструктор тестов, чтобы принять initializer_list - все еще не работает – Starl1ght

Смежные вопросы