下标运算符重载和对指针错误的引用

时间:2011-11-04 00:51:21

标签: c++ overloading operator-keyword subscript

我现在正在努力解决一个奇怪的错误,我需要你的帮助:D

我有一个'Image'类声明为

template <typename P>
class Image {
// ...
public: // Operators 
    Color<P>*& operator [] ( unsigned int const& i );
// ...
}

因为这是我第一次重载此运算符,所以我不太确定(特别是*&amp; part ...)

当我尝试这样的事情时出现问题:

/// 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>

显然,对我的解决方案更加困难......

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

所有“不匹配'...'”错误意味着调用中的参数与任何函数或运算符的声明参数不兼容,因此您应该查看参数声明。使operator[]参数为unsigned int。类似地,通过引用传递返回的指针是很奇怪的;不一定是坏事,但高度怀疑。通常,非复合类型应按值传递。

答案 1 :(得分:0)

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

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

请注意img[0]是抱怨的内容,因此= Color<double>(1.0, 1.0, 1.0);可能不是问题(除非我遗漏了一些SFINAE错误)。最后,请确保您没有Image专门double

编辑:顺便说一句,返回Color<P>*&有一个严重的劣势;有人可以做img[0] = 0,这可能不是该课程的用法。