2012-11-08 13 views
10

list_of Bu derler:kullanma boost :: atamak ::

std::vector<int> value = boost::assign::list_of(1)(2); 

Ama bu:

Constructor(std::vector<int> value) 
{ 
} 

Constructor (boost::assign::list_of(1)(2)); 

yapıcı geçirilen vektörü başlatılıyor için tek liner çözüm var mı?

Daha da iyisi, bunun yerine bir referans alarak bir sınıf değişkenine yapıcı kopya halinde:

enum Foo 
{ 
    FOO_ONE, FOO_TWO 
}; 

class Constructor 
{ 
public: 
    Constructor(const std::vector<Foo>& value){} 
}; 

Constructor c(std::vector<Foo>(boost::assign::list_of(FOO_ONE))); 

alıyorum:

Constructor(std::vector<int>& value) 
{ 
    _value = value; 
} 

UPDATE

aşağıdaki çalışırsanız derleyici hatası:

error C2440: '<function-style-cast>' : cannot convert from 'boost::assign_detail::generic_list<T>' to 'std::vector<_Ty>' 
1>   with 
1>   [ 
1>    T=Foo 
1>   ] 
1>   and 
1>   [ 
1>    _Ty=Foo 
1>   ] 
1>   No constructor could take the source type, or constructor overload resolution was ambiguous 
+0

Derleyici hata iletisini verebilir misiniz? –

+0

@Kevin MOLCARD Eklenmiş derleyici hatası – Baz

+2

[Bunun gibi bir hata var] (https://svn.boost.org/trac/boost/ticket/7364). –

cevap

19

Bu can sıkıcı bir sorundur, ayrıca bir süre önce de vardı. Biz convert_to_container yöntemini kullanarak düzelttim: çok yapıcı kullanarak std :: liste ile daha fazla sorun var

Constructor c(boost::assign::list_of(1)(2).convert_to_container<std::vector<int> >()); 

. Uygun cevap için Pass std::list to constructor using boost's list_of doesn't compile'a bakın.

+0

' conver_to_container' işlevini çağırmanın neden gerekli olduğunu anladınız mı? –

0

std geçici örneğini yapmak için bu şablonu kullanıyorum :: yerinde vektörü:

#include <vector> 
namespace Util { 
//init vector 
template <typename ELEMENT_TYPE > struct vector_of 
    : public std::vector<ELEMENT_TYPE> 
{ 
    vector_of(const ELEMENT_TYPE& t) 
    { 
     (*this)(t); 
    } 
    vector_of& operator()(const ELEMENT_TYPE& t) 
    { 
     this->push_back(t); 
     return *this; 
    } 
}; 
}//namespace Util 

Kullanımı şu şekilde görünecektir:

Constructor (Util::vector_of<int>(1)(2)); 

Yapıcı imza şu şekilde görünecektir:

Constructor(const std::vector<int>& value) 
{ 
    _value = value; 
}