2013-12-05 3 views
7
vector<vector<int> > res; 
    res.emplace_back({1,2}); // change to res.push_back({1,2}); would work 

Это дает мне ошибкуКак использовать std :: vector :: emplace_back для вектора <vector<int>>?

main.cpp:61:25: error: no matching function for call to ‘std::vector<std::vector<int> >::emplace_back(<brace-enclosed initializer list>)’ 
main.cpp:61:25: note: candidate is: 
In file included from /usr/include/c++/4.7/vector:70:0, 
       from /usr/include/c++/4.7/bits/random.h:34, 
       from /usr/include/c++/4.7/random:50, 
       from /usr/include/c++/4.7/bits/stl_algo.h:67, 
       from /usr/include/c++/4.7/algorithm:63, 
       from miscalgoc.hpp:1, 
       from main.cpp:1: 
/usr/include/c++/4.7/bits/vector.tcc:92:7: note: void std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = {}; _Tp = std::vector<int>; _Alloc = std::allocator<std::vector<int> >] 

Как сделать эту работу? Кроме того, зачем нужен распределитель?

+0

что ваша практическая проблема, с использованием 'push_back' вместо' emplace_back'? Какое имя и версия вашего компилятора и стандартной библиотеки вы используете? – Yakk

ответ

16

Проблема состоит в том, что аргументы шаблона функции не выводят std::initializer_list из списка с привязкой к элементам (например, { 1, 2 }).

Пример:

#include <initializer_list> 
#include <type_traits> 


template<typename T> 
void func(T arg) { 
} 


int main() { 
    auto init_list = {1, 2}; // This works because of a special rule 
    static_assert(std::is_same<decltype(init_list), std::initializer_list<int>>::value, "not same"); 

    func(std::initializer_list<int>{1, 2});  // Ok. Has explicit type. 

    func({1, 2}); // This doesn't because there's no rule for function 
        //  template argument to deduce std::initializer_list 
        //  in this form. 
} 

Live example

std::vector::emplace_back() шаблон функции с ее аргументами быть выведены. Так что прохождение {1, 2} не будет работать, потому что оно не может его вывести. Ввод явного типа в него

res.emplace_back(std::initializer_list<int>{1,2}); 

заставит его работать.

Live example

0

Посмотрите на documentation на номер vector::emplace_back. emplace_back пытается создать новый элемент в вашем векторе, вызывая конструктор для нового элемента с переданными аргументами. Таким образом, когда вы вызываете emplace_back({1,2}), он пытается передать {1,2} в конструктор, но так как res является вектором векторы ints, он смотрит на векторные конструкторы, ни один из которых не может принимать список инициализаторов, заключенных в фигурные скобки.

Кроме того, взгляните на documentation на номер vector::push_back. Когда вызывается push_back, он создает объект по умолчанию (в данном случае вектор ints) и копирует в него значения. Я бы предположил, что причина, по которой работает push_back({1,2}), заключается в том, что список инициализаторов, заключенный в фигурные скобки, создает тип значения, который принимает push_back.

+0

push_back не имеет этой проблемы. – user40129

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