vector::push_back
的签名是:
void push_back (const value_type& val);
这意味着它负责不破坏 val
。
我的职能是:
Result User::addFriend(const User* newFriend)
{
// check that newFriend is valid and is not already a friend
if (newFriend == NULL || isFriend(newFriend)) return FAILURE;
friends_.push_back(newFriend);
friendsNum_++;
return SUCCESS;
}
当我编译 .c 文件时出现编译错误:
invalid conversion from 'const User*' to
std::vector User*::value_type
如果 push_back promise 不更改 val,为什么我们会收到此错误?
克服错误的正确且简洁的方法是什么?也许是 const_cast?
谢谢!
用户.h:
class User {
...
public:
vector<User*> friends_;
...
}
最佳答案
您正在存储一个指针 vector :
std::vector<User*> friends_;
但是,这种方法存在一个问题。请注意,这些指针不是 const User*
:任何有权访问 friends_
的人都可以自由修改 User
。
这里的vector
中的类型参数是User*
,不是User
,也就是说value_type ≡ User
。因此,这条线
void push_back (const value_type& val);
应该这样解释:
void push_back (const User*& val);
请注意 the syntax is a bit misleading here ;一个更清晰的方式来看待它是这样的:
void push_back (User *const &val);
const
修改左侧的内容: 它防止指针被更改,但它不会阻止底层的 User
本身不会被改变。
因为 const
只影响指针而不影响 User
,传入 const User*
会违反契约:
Result User::addFriend(const User* newFriend){
…
friends_.push_back(newFriend);
…
}
你不能这样做。由于 addFriend
promise 不会阻止 User
被更改,因此将其存储到 non-const User*
的 vector 中> 将允许任何有权访问 vector 的人随意修改 User
。
可能的解决方案:
- 让
addFriend
使用User*
而不是const User*
。更好的是:除非你有充分的理由不这样做,否则请使用引用。 - 将
friends_
更改为使用const User*
而不是User*
。更好的是:直接存储User
而不是作为指针。 - 复制
用户
。
关于c++ - vector::push_back 从 const Type* 到 type* 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27725290/