编译错误 - 使用const成员设置std :: set

时间:2011-04-02 21:29:37

标签: c++

我不能为我的生活找出这段代码的错误:

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);
}

3 个答案:

答案 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上)。