C++ 下标运算符重载:返回引用问题

C++ 下标运算符重载:返回引用问题,c++,reference,operator-overloading,subscript-operator,C++,Reference,Operator Overloading,Subscript Operator,我第一次重载下标运算符,返回参考值时遇到问题。 我遵循了c++常见问题标签中的一篇文章中的经验法则,但我缺少了一些东西 const T& operator[](int index) const { if ((index < 0) || (index > size)) { // provide exception handling for this error std::cout << "Error!

我第一次重载下标运算符,返回参考值时遇到问题。
我遵循了c++常见问题标签中的一篇文章中的经验法则,但我缺少了一些东西

const T& operator[](int index) const {
    if ((index < 0) || (index > size)) {
                    // provide exception handling for this error
        std::cout << "Error! Index out of bound." << std::endl;
        std::exit(0);
    } else {
        Block* b = head;
        while (b) {
            if (b->position == index)
                return *b->data;

            b = b->next;
        }
    }
}
const T&运算符[](int-index)const{
如果((索引<0)| |(索引>大小)){
//为此错误提供异常处理
std::cout数据;
b=b->next;
}
}
}
我在两种变体中实现了它们:使用
const
返回值和
const
函数(如上所述),而不使用(除了两个
const
关键字之外,这是相同的)。
问题是,当我运行主测试时,它只是崩溃了。我以为bug在
return*b->data中语句,但我不知道它可能是什么,也不知道我是否错了,是否还有其他错误
有什么想法吗?

提前感谢。

如果您想返回数据引用,我不确定它是否是您想要的,您需要返回T类型的引用,我假设数据是T类型的,它应该是这样的:

return b->data;
否则,您将返回数据地址的引用


编辑:更正错误

首先,
(索引>大小)
应为
(索引>=大小)
(或更“可视”
(大小位置==索引)
并在
b
变为null时退出循环?函数不会返回任何内容,这是未定义的行为,您也应该处理该错误情况。@gx_u您对处理无返回值的情况有什么建议吗?我已经考虑过该错误,但将其留给以后修复。我不知道您的代码的内部结构…如果t在逻辑上永远不会发生(即,如果对于每个有效的
索引
,在链接列表的
中应该存在一个相等的
位置
),我假设您可以在
主体之后放置一个断言(或打印一个错误并如上所述退出)(或在功能体结束之前)。在你这么做之后,再加上我第一次评论中的修复,你的程序是否仍然崩溃?和/或它是否打印了一些错误消息?@gx_uu是的,我做了修复,但程序仍然崩溃,没有任何编译器错误/警告,也没有打印任何内容。如果你有耐心阅读,请看下面的代码:。无论如何,感谢你给我的帮助“直到否”w、 .Erm,为什么不直接使用
std::vector
?关于你的粘贴库有很多要说的(顺便说一句,你没有显示你的
main
)…很多指针(带有
新的
,但没有
删除
);
没有使用
数组的默认构造函数进行初始化(代码< >代码>块/代码>的构造函数需要一个<代码> t*<代码>指针,但是你可以通过一个<代码> t>代码>值(我认为它不会编译,但是例如用<代码>数组< /代码>它通过代码>())/代码>代码> > 0代码>代码>,它可以转换为(null)指针,其他可能的崩溃原因,如果你尝试<代码> *数据< /代码>;复制和销毁未被处理--字符用尽您所说的与链接相矛盾。
->
的优先级高于
*
。如果我从返回中删除
*
,我将返回此
错误:错误:从类型为“int*”的表达式中初始化类型为“int&”的引用无效。