以 2 种变体重载 [] 的问题

发布于 2024-09-26 03:33:55 字数 613 浏览 2 评论 0原文

这是我的通用类:

template<class T, class PrnT>
class PersonalVec {

public:
    PersonalVec();
    T &operator[](int index) const;
    const T &operator[](int index) const;

private:
    std::vector<T> _vec;

};

我需要实现 2 个版本的 [] 运算符:
一种将返回常量引用,另一种也将返回引用的常规引用。 当我编译它时,我得到:
PersonalVec.hpp:23: 错误: 'const T& PersonalVec::operator[](int) const' 不能重载
PersonalVec.hpp:22: 错误:带有 'T& PersonalVec::operator[](int) const

我已将其中之一作为注释,然后它会编译,所以我猜它们以某种方式发生冲突。有什么问题以及如何解决它?

谢谢你!

this is my generic class:

template<class T, class PrnT>
class PersonalVec {

public:
    PersonalVec();
    T &operator[](int index) const;
    const T &operator[](int index) const;

private:
    std::vector<T> _vec;

};

I'm required to implement 2 versions of [] operator:
one that will return a const reference and a regular one that will also return a reference.
When i compile it i get:
PersonalVec.hpp:23: error: ‘const T& PersonalVec<T, PrnT>::operator[](int) const’ cannot be overloaded
PersonalVec.hpp:22: error: with ‘T& PersonalVec<T, PrnT>::operator[](int) const

I've put either one of them as remark and then it does compile, so i guess they are colliding somehow. What is the problem and how can i fix it?

thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

茶色山野 2024-10-03 03:33:55

您需要:

T &operator[](int index);
const T &operator[](int index) const;

即非常量运算符返回非常量引用,而常量一返回常量引用。

You need:

T &operator[](int index);
const T &operator[](int index) const;

i.e. non-const operator returns non const reference and const one returns the const reference.

夏尔 2024-10-03 03:33:55

不能根据返回类型进行重载,只能根据参数类型进行重载,包括成员函数的隐藏 this 参数。

函数调用表达式或涉及潜在重载运算符的表达式的类型由重载决策选择的函数类型决定,您不能强制此类表达式具有特定类型并尝试从返回类型影响重载决策。

您需要为重载函数提供因参数类型或 this 的常量性而异的签名,或者您需要选择一种适当的返回类型并拥有单个函数。

You can't overload based on return type, you can only overload based on parameter types, including the hidden this parameter for member functions.

The type of a function call expression, or an expression involving a potentially overloaded operator, is determined by the function type chosen by overload resolution, you cannot force such an expression to have a particular type and try to influence the overload resolution from the return type.

You need to either give your overloaded functions signatures that differ by parameter types or the constness of this, or you need to pick one appropriate return type and have a single function.

冰雪梦之恋 2024-10-03 03:33:55

返回非常量引用时,您需要删除函数的常量性。

<代码>
T &operator[](int index);
const T &operator[](int index) const;
重载

不会也不可能发生在返回类型上。

You will need to remove constness of the function when returning the non-const reference.


T &operator[](int index);
const T &operator[](int index) const;

Overloading does not and can not happen on the return type.

百变从容 2024-10-03 03:33:55

函数的返回类型不是可用于函数重载的标准。
如果满足以下条件,则可以重载函数:
1. 参数数量不同
2. 不同的参数顺序或
3. 不同类型的参数

您试图根据返回类型重载函数,因此会出现错误。
即使不满足上述 3 个条件,'const' 关键字也可以帮助您重载函数。因此,简单的解决方案可以是将其中一个函数设置为常量,并将其他函数保留为正常函数

Return type of a function is not a criteria that can be used for overloading of functions.
A function can be overloaded if:
1. Different no of arguments
2. Differnt Sequence of arguments or
3. Different types of arguments

You are trying to overload the function based on return type and hence it gives the error.
The 'const' keyword can help you overload functions even if the above 3 criterias are not met. So simple solution can be to make one of the function const and keep other as a normal function

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文