use*_*952 3 c++ boost g++ c++11 std-pair
为什么这不能编译g ++ 4.6和g ++ 4.7?我试图获得字符串到线程特定存储的映射.我相信,有一些像这样的东西在提升1.48.实际上,它与boost的版本无关,但是标志-std = c ++ 0x.如果不存在则编译.因此,寻找错误的解释以及如何解决它.
谢谢
#include <map>
#include <boost/thread/tss.hpp>
#include <boost/shared_ptr.hpp>
int main(int argc, char** argv) {
typedef boost::thread_specific_ptr< int > Tss_int_ptr;
typedef std::map< std::string, Tss_int_ptr > Tss_int_map_t;
Tss_int_map_t tmap;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误消息如下.
g++-4.7 -g -std=c++0x -I"/home/someone/open_source/admin/install/boost_1_52_0/include" -c ~/tmp/fail.cpp
In file included from /usr/include/c++/4.7/bits/stl_algobase.h:65:0,
from /usr/include/c++/4.7/bits/stl_tree.h:63,
from /usr/include/c++/4.7/map:60,
from /home/someone/tmp/fail.cpp:1:
/usr/include/c++/4.7/bits/stl_pair.h: In instantiation of ‘struct std::pair<const std::basic_string<char>, boost::thread_specific_ptr<int> >’:
/usr/include/c++/4.7/bits/stl_tree.h:133:12: required from ‘struct std::_Rb_tree_node<std::pair<const std::basic_string<char>, boost::thread_specific_ptr<int> > >’
/usr/include/c++/4.7/bits/stl_tree.h:1082:4: required from ‘void std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_erase(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Link_type) [with _Key = std::basic_string<char>; _Val = std::pair<const std::basic_string<char>, boost::thread_specific_ptr<int> >; _KeyOfValue = std::_Select1st<std::pair<const std::basic_string<char>, boost::thread_specific_ptr<int> > >; _Compare = std::less<std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, boost::thread_specific_ptr<int> > >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Link_type = std::_Rb_tree_node<std::pair<const std::basic_string<char>, boost::thread_specific_ptr<int> > >*]’
/usr/include/c++/4.7/bits/stl_tree.h:646:9: required from ‘std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::~_Rb_tree() [with _Key = std::basic_string<char>; _Val = std::pair<const std::basic_string<char>, boost::thread_specific_ptr<int> >; _KeyOfValue = std::_Select1st<std::pair<const std::basic_string<char>, boost::thread_specific_ptr<int> > >; _Compare = std::less<std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, boost::thread_specific_ptr<int> > >]’
/usr/include/c++/4.7/bits/stl_map.h:90:11: required from here
/usr/include/c++/4.7/bits/stl_pair.h:119:17: error: ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const std::basic_string<char>; _T2 = boost::thread_specific_ptr<int>; std::pair<_T1, _T2> = std::pair<const std::basic_string<char>, boost::thread_specific_ptr<int> >]’ declared to take const reference, but implicit declaration would take non-const
Run Code Online (Sandbox Code Playgroud)
thread_specific_ptr 声明这些成员,以使类不可复制(注意非const参数):
private:
thread_specific_ptr(thread_specific_ptr&);
thread_specific_ptr& operator=(thread_specific_ptr&);
Run Code Online (Sandbox Code Playgroud)
在C++ 03 std::pair中没有声明复制构造函数,因此如果程序需要,则隐式生成一个.A std::pair<X, thread_specific_ptr>不可复制,因为其中一个成员不可复制,因此如果使用隐式复制构造函数,则会出错.
在C++ 11中std::pair有一个复制构造函数,它是明确默认的.它有签名:
pair(const pair&) = default;
Run Code Online (Sandbox Code Playgroud)
编译器错误告诉您隐式生成的复制构造函数将具有此签名,因为thread_specific_ptr复制构造函数签名采用非const引用:
pair(pair&) = default;
Run Code Online (Sandbox Code Playgroud)
因为默认构造函数与隐式声明的构造函数没有相同的签名,所以复制构造函数格式不正确.
因此,在这两种情况下pair<X, thread_specific_ptr>都不可复制,但在C++ 11中,即使您不尝试复制对象,也会更快地发现错误.
如果boost::thread_specific_ptr使用普通的C++ 11习惯用于使类不可复制,则代码可以工作:
thread_specific_ptr(const thread_specific_ptr&) = delete;
thread_specific_ptr& operator=(const thread_specific_ptr&) = delete;
Run Code Online (Sandbox Code Playgroud)
所以我会将此报告为Boost的错误.在C++ 11模式下,应删除复制操作.
作为一种解决方法,您可以使用已删除的复制操作将类型包装在您自己的类型中,然后使用它:
template<typename T>
struct TSS : boost::thread_specific_ptr<T>
{
TSS() = default;
TSS(void (*f)(T*)) : boost::thread_specific_ptr<T>(f) { }
TSS(const TSS&) = delete;
TSS& operator=(const TSS&) = delete;
};
Run Code Online (Sandbox Code Playgroud)
现在你可以使用它,你的代码将编译:
typedef TSS< int > Tss_int_ptr;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1291 次 |
| 最近记录: |