C++ 从类型‘;转换的常量无效;标准::向量<;信息>**’;键入‘;标准::向量<;信息*>*’;

C++ 从类型‘;转换的常量无效;标准::向量<;信息>**’;键入‘;标准::向量<;信息*>*’;,c++,C++,我在函数返回语句中得到一个错误。如果函数声明为: const vector<Message*>& getMessages(string messageBox) const; constvector&getMessages(stringmessagebox)const; 我有类Message、Box和MessageBox: class Box { public: vector <Message> *messages; string name; p

我在函数返回语句中得到一个错误。如果函数声明为:

const vector<Message*>& getMessages(string messageBox) const;
constvector&getMessages(stringmessagebox)const;
我有类Message、Box和MessageBox:

class Box
{
public:
    vector <Message> *messages;
    string name;
public:
    Box();
       ~Box();
};

class MessageBox
{
public:
    MessageBox(); 
    ~MessageBox(); 
        const vector<Message>& getMessages(string messageBox) const;
private:
    Box *inbox;
};
类框
{
公众:
矢量*信息;
字符串名;
公众:
Box();
~Box();
};
类消息框
{
公众:
MessageBox();
~MessageBox();
constvector&getMessages(stringmessagebox)const;
私人:
盒子*收件箱;
};
现在我正在尝试实现函数getMessages。我尝试返回向量*的消息 收件箱。它看起来像:

 const vector<Message>& MessageBox::getMessages(string messageBox) const
{
   if(messageBox == "inbox")
     return (const_cast  <vector<Message>&>(inbox->messages));
}
常量向量和MessageBox::getMessages(字符串MessageBox)常量 { 如果(messageBox==“收件箱”) 返回(const_cast(收件箱->消息)); } 这给了我前面提到的一个错误。也许,我应该更改变量。

有什么想法吗?谢谢。这是你的问题。
inbox->messages
的类型是
const std::vector*
。如果要返回对
收件箱->邮件所指向的值的引用,只需引用指针:

return *inbox->messages;
根本不需要
const\u cast
,因为源和目标类型都已经是
cosnt


也就是说,您的代码不必要地使用了大量指针。为什么
inbox
是指针?为什么不只是一个价值观成员?为什么
messages
是指向
std::vector的指针而不仅仅是一个值?

您的返回行应该是

return *inbox->messages;
请注意,如果
messageBox!=“收件箱”
。这将有点棘手,因为您不能合法地返回对临时本地的引用

您的
getMessages
函数最好返回
std::vector*
,因为这就是它在类中的保存方式,它可以让代码用户更清楚地知道,在访问指针时应该采取通常的预防措施(即检查
nullptr

更好的办法是完全摆脱原始指针的使用。支持
std::shared_ptr
用于
消息
,因为它是在
Box
和任何调用
getMessages
之间共享的,如果它不是共享的,则支持
unique_ptr
用于
Box


你可能并不需要这两个都是指针,所以根本不使用指针会更简单。除非您希望
消息
的大小很大和/或
getMessages
被频繁调用,只返回
消息的副本

看起来像是试图返回指针而不是所需的引用,这并不是不合理的,也安全得多。
常量向量&
并不意味着必须返回
&变量
。这里的&不是addressof,而是byref。类型
std::vector**
std::vector*
是不相关的。
const\u cast
不会(也不应该!)在它们之间转换。请发布函数体并解释您试图执行的操作。但是如果使用const进行声明,如何在不使用const_cast的情况下返回它?问题标题中的错误消息与
getMessages
的第一个声明一致,但与
MessageBox::getMessages
的声明或定义不一致。请仅发布与您正在发布的错误消息相匹配的代码版本,或者仅发布与您发布的代码实际获得的错误消息。您的意思是源代码和目标代码都是非常量的吗?@Fraser:否。成员函数是一个
const
指针,因此,通过它访问的成员将自动成为
const
。并且目的地类型是一个
常量
向量。所以输入和输出都是常量。我正在阅读与
const\u cast
本身的目标相关的源和目标。如果他在演员阵容中取消了对
收件箱->消息的引用,他的功能将正常工作。但是演员阵容是无关的,因为他在返回之前将非常量
*收件箱->消息
投射到非常量
向量&