【问题标题】:Subscript operator overload and reference to pointer error下标运算符重载和引用指针错误
【发布时间】:2011-12-21 16:07:56
【问题描述】:

我正在为一个奇怪的错误苦苦挣扎一段时间,我需要你的帮助 :D

我有一个像

一样声明的“图像”类
template <typename P>
class Image {
// ...
public: // Operators 
    Color<P>*& operator [] ( unsigned int const& i );
// ...
}

由于这是我第一次重载这个运算符,我不太确定(尤其是 *& 部分......)

当我尝试类似的东西时出现问题:

/// Sample Code
Image<P> img; img[0][0] = Color<double>(1.0, 1.0, 1.0);

我明白了

./src/Graphics/PNGWriter.cc:12:3: error: no match for ‘operator[]’ in ‘img[0]’
./src/Graphics/Image.cc:24:12: note: candidate is: Color<P>*& Image<P>::operator[](const unsigned int&) [with P = double] <near match>

显然,我的解决方案更加晦涩难懂...

有什么想法吗?

谢谢!

【问题讨论】:

  • Color

    是否有重载的 operator[]?

  • 不,为什么会有一个(我的意思是,它可以索引 RGB 分量,但特别是针对这个问题)?
  • 你用的是什么编译器?请发布完整、简洁的minimal sample 以重现该行为。

标签: c++ overloading operator-keyword subscript


【解决方案1】:

所有“不匹配'...'”错误意味着调用中的参数与任何函数或运算符的声明参数不兼容,因此您应该查看参数声明。为 operator[] 提供一个无符号整数的参数。同样,通过引用传递返回的指针也很奇怪。不一定坏,但高度怀疑。一般来说,非复合类型应该按值传递。

【讨论】:

  • 其实我试过了,但由于它与确切的签名不匹配,所以我尝试了这个......
【解决方案2】:

首先,没有必要通过引用传递这么多东西。按值取 unsigned int 几乎肯定不会减慢速度。对指针的引用也一样。

这可能是问题所在,但我对此表示怀疑;我不明白为什么 0 不会转换为 unsigned int const&amp;。另一种可能性是图像实际上是const,但您没有在粘贴中提及这一点。下标运算符通常成对出现;您需要将另一个声明为Color&lt;P&gt; const* operator [] ( unsigned int i ) const;

请注意,img[0] 是被投诉的内容,因此 = Color&lt;double&gt;(1.0, 1.0, 1.0); 可能不是问题(除非我遗漏了一些 SFINAE 错误)。最后,确保您没有将Image 专门用于double

编辑:顺便说一句,返回Color&lt;P&gt;*&amp; 有一个严重的缺点;有人可以做img[0] = 0,这可能不是该类的使用方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    相关资源
    最近更新 更多