C++ 能否使用boost::reference\u包装器将引用存储在STL容器中?

C++ 能否使用boost::reference\u包装器将引用存储在STL容器中?,c++,boost,C++,Boost,我正在尝试这样做:维护两个字符串向量,其中一个向量存储值,第二个向量存储相同值的引用。我原以为使用boost::reference\u wrapper就可以了,但似乎不行。我的平台是Visual C++ 2008。 std::vector<std::string> str_vec; str_vec.push_back("abc"); str_vec.push_back("cde"); str_vec.push_back("fgh"); std::vector<boost::r

我正在尝试这样做:维护两个字符串向量,其中一个向量存储值,第二个向量存储相同值的引用。我原以为使用
boost::reference\u wrapper
就可以了,但似乎不行。我的平台是Visual C++ 2008。
std::vector<std::string> str_vec;
str_vec.push_back("abc");
str_vec.push_back("cde");
str_vec.push_back("fgh");

std::vector<boost::reference_wrapper<std::string> > str_view;
for(std::vector<std::string>::iterator it = str_vec.begin(); it != str_vec.end(); ++it)
{
  str_view.push_back(*it);
}
std::vector str_vec;
用力向后推(“abc”);
str_vec.push_back(“cde”);
用力向后推(“fgh”);
std::向量stru视图;
对于(std::vector::iterator it=str_vec.begin();it!=str_vec.end();++it)
{
str_view.向后推(*it);
}
这就是错误:

错误C2664:'std::vector::push_back':无法将参数1从std::basic_string'转换为'const boost::reference'


我可以使用
boost::shared\u ptr
,但我认为引用更能表达我的意图。这段代码可能可以在C++11中使用
std::reference\u wrapper
工作,但我现在无法使用它。

是的,它可以。文档中指出它是
可复制的
可分配的
,这是容器模板参数所必需的概念。但是您需要使用
boost::ref
boost::cref
来创建
reference\u wrapper
类型的对象。没有隐式转换,这就是代码无法工作的原因

请注意,
std::reference_wrapper
boost::reference_wrapper
之间的一个细微区别是,只有
std
版本可以使用functor

例如:

std::vector<std::string> str_vec;
str_vec.push_back("abc");
str_vec.push_back("cde");
str_vec.push_back("fgh");

std::vector<boost::reference_wrapper<std::string> > str_view;
std::transform(begin(str_vec), end(str_vec),
               std::back_inserter(str_view), boost::ref<std::string>);
std::vector str_vec;
用力向后推(“abc”);
str_vec.push_back(“cde”);
用力向后推(“fgh”);
std::向量stru视图;
转换(开始(str_-vec),结束(str_-vec),
std::back_插入器(str_视图),boost::ref);
如果您不喜欢这样做,并且希望从原始值进行隐式转换,则可能需要使用:

template<typename T>
class my_ref_wrap : public boost::reference_wrapper<T> {
public:
  my_ref_wrap(T& t) : boost::reference_wrapper<T>(t) {}
};

std::vector<my_ref_wrap<std::string> > str_view;
std::copy(begin(str_vec), begin(str_vec),
          std::back_inserter(str_view));
模板
类my_ref_wrap:public boost::reference_wrapper{
公众:
my_ref_wrap(T&T):boost::reference_wrapper(T){}
};
std::向量stru视图;
复制(开始(str_-vec),开始(str_-vec),
std::背向插入器(str_视图);

虽然我不会这么做。< /P>什么是Visual C++ 2009?据我所知,有2008年、2010年和2011年的测试版。你介意把你的例子放在C++03中吗。我没有c++11compiler@user841550这基本上是C++03。您只需将
begin(str_vec)
更改为
str_vec.begin()
。同样,对于
end()