我不能为我的生活找出这段代码的错误:
ClassA & doSomething (std::set<boost::shared_ptr<ClassB const> const > const & someSet)
{
std::set<boost::shared_ptr<ClassB> > secondSet;
for (std::set<boost::shared_ptr<ClassB const> const >::const_iterator it = someSet.begin(); it != someSet.end(); it++)
{
if (checkSomething(*it))
secondSet.insert(boost::const_pointer_cast<ClassB>(*it));
}
}
当我尝试编译时,我从第4行(for循环的开始)得到以下错误:g ++:
/usr/include/c++/4.4/ext/new_allocator.h:79: error: ‘const _Tp* __gnu_cxx::new_allocator<_Tp>::address(const _Tp&) const [with _Tp = const boost::shared_ptr<const ClassB>]’ cannot be overloaded
/usr/include/c++/4.4/ext/new_allocator.h:76: error: with ‘_Tp* __gnu_cxx::new_allocator<_Tp>::address(_Tp&) const [with _Tp = const boost::shared_ptr<const ClassB>]’
如果我将std::set
声明更改为包含非const boost::shared_ptr
,则代码编译完美,但这意味着我将无法在代码中强制执行const-correctness。
有没有人知道可能导致这些错误的原因是什么?我搜索过谷歌和谷歌StackOverflow没有任何运气。
以下是最低(非)工作示例:
#include <set>
#include <boost/shared_ptr.hpp>
class ClassB;
class ClassA
{
public:
ClassA & doSomething (std::set<boost::shared_ptr<ClassB const> const > const & someSet);
};
ClassA & doSomething (std::set<boost::shared_ptr<ClassB const> const > const & someSet)
{
std::set<boost::shared_ptr<ClassB> > secondSet;
for (std::set<boost::shared_ptr<ClassB const> const >::const_iterator it = someSet.begin(); it != someSet.end(); it++)
{
if (checkSomething(*it))
secondSet.insert(boost::const_pointer_cast<ClassB>(*it));
}
return (*this);
}
答案 0 :(得分:7)
但这意味着我无法在我的代码中强制执行const-correctness
我认为你可能错了。只要它是一个指向const对象的智能指针,您可能只操纵集合中的指针,而不是指向的对象。这是一个重点,因为如果一个集合无法触及值,它就无法组织起来。
这是
之间的经典差异const char* x; // pointer to const char
const char* const x; // constant pointer to const char
char* const x; // constant pointer, to non-const char
只有这一次使用smartpointers。您还可以自己验证这个简单测试对于const项目是否会失败:
#include <set>
int main()
{
std::set<const int> a;
a.insert(1);
return 1;
}
删除'const'后,它会起作用。
OT:如果你想要一些具有某种“密钥”保护的容器,你应该看一下map,因为在value_type(std :: pair)中,键(.first)总是const-IIRC。我仍然认为关于容器元素的const正确性,这一点没有实际意义。
答案 1 :(得分:5)
§23.1/ 3规定std::set
密钥类型必须是可分配的并且可复制构造;显然const类型不可分配。
答案 2 :(得分:0)
我确实有提升尝试它,但我认为你应该修复ClassB而不是shared_ptr, 尝试删除中间const(在shared_ptr上)。