Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译错误-std::set带有常量成员_C++ - Fatal编程技术网

C++ 编译错误-std::set带有常量成员

C++ 编译错误-std::set带有常量成员,c++,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>

我一辈子都搞不清楚这个代码到底出了什么问题:

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));
  }
}
但这意味着我将无法在代码中强制执行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。您还可以亲自验证此简单测试是否会因常量项而失败:

#include <set>

int main()
{
    std::set<const int> a;
    a.insert(1);
    return 1;
}
#包括
int main()
{
std::设置a;
a、 插入(1);
返回1;
}
一旦删除“const”,它就会工作



OT:如果您想要一些具有某种“密钥”保护的容器,您可能应该查看map,因为在value_类型(std::pair)中,密钥(.first)始终是const-IIRC。关于容器元素的const正确性,我仍然认为这一点是没有意义的。

我确实需要boost来尝试,但我认为您应该const ClassB,而不是shared\u ptr,
尝试删除中间常量(在共享的ptr上)。

§23.1/3规定
std::set
键类型必须是可分配和可复制的;很明显,常量类型是不可分配的。

这不是“例外”。它是编译错误,所以不可能创建具有const成员的集合。更新的SNOWER应该是确信的不是对象的属性而不是对象的类型吗?@ SEHE,例如,C++中有两种“int”类型,即常态int和常数int。“const限定符将数据对象显式声明为无法更改的内容”。你愿意详细说明你的答案吗?@celavek:不太愿意,但我的尝试是:
X
隐式转换为
const X
,但不是相反。只有
const
方法可以通过const对象/指针调用。指向常量的指针也是如此types@sehe我真的意识到了这一点,但我并没有谈论这一点。你在第一条评论中否定(或否定地回答)了我的问题,说常量不是对象的属性,而是对象的类型。但既然你不想详细说明,那我们就不谈了。@celavek:我很乐意详细说明,但我不明白你的困惑在哪里
const
-ness(和
volatile
-ness)确实是类型的一部分。
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
#include <set>

int main()
{
    std::set<const int> a;
    a.insert(1);
    return 1;
}