2

사과 비슷한 질문에 해결책이있는 경우 유사한 오류 출력/문제가있는 것을 찾을 수 없습니다.emplace_back에 완벽한 전달 템플릿 매개 변수 팩 - 컴파일 실패

이 코드 컴파일을 시도하고있다 :

#include <vector> 
using namespace std; 

template< typename value_type > 
class obj 
{ 
    vector<value_type> m_v; 
    public: 

    template<class... vaList_t> 
    void _emplace_back(vaList_t&&... i_values) 
    { 
     m_v.emplace_back(forward<vaList_t>(i_values)...); 
    } 
}; 

int main() 
{ 
    obj<int> thing; 
    thing._emplace_back(1,2,3,4); 
    return 0; 
} 

가 함께 컴파일에 실패 그러나 :

In file included from /usr/include/x86_64-linux-gnu/c++/4.9/bits/c++allocator.h:33:0, 
       from /usr/include/c++/4.9/bits/allocator.h:46, 
       from /usr/include/c++/4.9/vector:61, 
       from 1: 
/usr/include/c++/4.9/ext/new_allocator.h: In instantiation of 'void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = int; _Args = {int, int, int, int}; _Tp = int]': 
/usr/include/c++/4.9/bits/alloc_traits.h:253:4: required from 'static std::_Require<typename std::allocator_traits<_Alloc>::__construct_helper<_Tp, _Args>::type> std::allocator_traits<_Alloc>::_S_construct(_Alloc&, _Tp*, _Args&& ...) [with _Tp = int; _Args = {int, int, int, int}; _Alloc = std::allocator<int>; std::_Require<typename std::allocator_traits<_Alloc>::__construct_helper<_Tp, _Args>::type> = void]' 
/usr/include/c++/4.9/bits/alloc_traits.h:399:57: required from 'static decltype (_S_construct(__a, __p, (forward<_Args>)(std::allocator_traits::construct::__args)...)) std::allocator_traits<_Alloc>::construct(_Alloc&, _Tp*, _Args&& ...) [with _Tp = int; _Args = {int, int, int, int}; _Alloc = std::allocator<int>; decltype (_S_construct(__a, __p, (forward<_Args>)(std::allocator_traits::construct::__args)...)) = <type error>]' 
/usr/include/c++/4.9/bits/vector.tcc:97:40: required from 'void std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = {int, int, int, int}; _Tp = int; _Alloc = std::allocator<int>]' 
13:3: required from 'void obj<value_type>::_emplace_back(vaList_t&& ...) [with vaList_t = {int, int, int, int}; value_type = int]' 
20:30: required from here 
/usr/include/c++/4.9/ext/new_allocator.h:120:4: error: new initializer expression list treated as compound expression [-fpermissive] 
    { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); } 

질문 :

  • 완벽 전달 템플릿이 올바른 구문입니다 매개 변수 팩? (무엇이 아닌 경우)
  • 이 동작을 수행하는 올바른 방법은 무엇입니까?

감사합니다.

편집 불명확 함. 나는 형의 서명 emplace_back이라는 벡터 함수를 호출하는 것을 시도하고있다 :

template< class... Args > void emplace_back(Args&&... args); 

을 추가 할 여러 요소를 포함하는 전달 완벽한, 템플릿 매개 변수 팩.

예 :

  • "1,2,3,4"- 3 개의 다른 개체를 추가 -
  • "참, 거짓, 거짓" emplace_back을 통해 벡터의 뒷면에 4 개의 다른 개체를 추가 emplace_back 통해 벡터의 후면
+1

이 아마도 당신이'm_v.insert 의미 (m_v.end() {앞으로 (i_values를) ...});', 또는'(m_v.emplace_back (전달 (i_values)), ...); ' –

+1

벡터에 4 개의 항목을 삽입 하시겠습니까? – kennytm

+0

@PiotrSkotnicki ", ..."이 컴파일되지 않습니다. 인서트가 컴파일됩니다. 그러나 그것은 완벽하지 않습니다 매개 변수 팩을 전달? 삽입을위한 함수 인자는 반복자와 초기화리스트이므로 추가 오버 헤드가 발생합니까? – QuantumKarl

답변

4

c.emplace_backc 단일 요소를 생성한다. 여러 개가 필요한 경우 emplace_back을 확장해야합니다. 이런 식으로 뭔가 :

template<class... vaList_t> 
void _emplace_back(vaList_t&&... i_values) 
{ 
    int dummy[] = { 0, (m_v.emplace_back(forward<vaList_t>(i_values)), 0)... }; 
} 

[Live example]

+0

감사합니다. 이제 알 수 있습니다 : "컨테이너 끝에 새로운 요소를 추가합니다." (템플릿 매개 변수 버전은 여러 개의 인수가있는 객체에 대한 것이며 여러 객체에 주목하십시오). – QuantumKarl

+0

@QuantumKarl 바로 가기. 'push_back'을 통한'emplace_back'의 진정한 힘은 생성자 인자를 끝까지 전달함으로써 (복사/이동하는 대신에) 컨테이너에서 요소를 직접 생성 할 수 있다는 것입니다. – Angew