例如,根据有关多重集的文档,请参见http://www.cplusplus.com/reference/set/multiset/insert/。应该可以插入一个const值。在我的示例中,多集是指针的集合,但是当我尝试插入const指针时会出错。
template<typename Key>
struct node_key: public node_base {
node_key(Key k): _key(k) {}
virtual ~node_key() {}
const Key& key() const { return _key;}
protected:
Key _key;
void _copy_key(node_key<Key> *n) const { n->_key=_key;}
};
template <typename Compare>
struct ptr_less_key {
ptr_less_key() : _comp() {}
virtual ~ptr_less_key() {}
template <typename Pointer>
bool operator()(const Pointer& a, const Pointer& b) const { return _comp(a->key(), b->key()); }
Compare _comp;
};
int main() {
typedef node_key<int>* keyp;
std::multiset<keyp,ptr_less_key<std::less<int>>> x;
node_key<int> k(5);
const node_key<int> *p=&k;
x.insert(p); //this fails
return 0;
}
答案 0 :(得分:2)
您当前正在做什么:您并不是像您想的那样尝试插入const指针,而是插入指向 const元素的 non-const 指针。
更改此
const node_key<int> *p=&k;
对此
node_key<int> *const p=&k;
使const关键字应用于指针,而不是指向的指针。
答案 1 :(得分:1)
给予
struct node {
void member();
void const_member() const;
};
考虑四个声明
node* pointer_to_node;
const node* pointer_to_const_node;
node* const const_pointer_to_node;
const node* const const_pointer_to_const_node;
const
的性质有两个不同方面:对象node
的性质和指针的性质。前两个声明了指向node
或const node
的可变指针。从node*
到const node*
的转换是允许的(并且是隐式的),但不允许相反,因为这样可以修改const node
。
后两个声明将各自的指针声明为常量,即,不能修改这些指针(尽管node
指向的const_pointer_to_node
可以修改。
pointer_to_node->member(); // okay
pointer_to_node->const_member(); // okay
pointer_to_node = new node; // okay
pointer_to_node = const_pointer_to_node; // okay
pointer_to_node = pointer_to_const_node; // ERROR
pointer_to_const_node->member(); // ERROR
pointer_to_const_node->const_member(); // okay
pointer_to_const_node = new node; // okay
pointer_to_const_node = pointer_to_node; // okay
pointer_to_const_node = const_pointer_to_node; // okay
pointer_to_const_node = const_pointer_to_const_node; // okay
const_pointer_to_node->member(); // okay
const_pointer_to_node->const_member(); // okay
const_pointer_to_node = new node; // ERROR
const_pointer_to_node = const_pointer_to_node; // ERROR
const_pointer_to_node = pointer_to_const_node; // ERROR
const_pointer_to_const_node->member(); // ERROR
const_pointer_to_const_node->const_member(); // okay
const_pointer_to_const_node = new node; // ERROR
const_pointer_to_const_node = const_pointer_to_node; // ERROR
const_pointer_to_const_node = pointer_to_const_node; // ERROR