重载的运算符[]未被使用

时间:2015-10-27 18:05:27

标签: c++

给出一个最小的例子:

#ifndef ARR_H_
#define ARR_H_

#include <iostream>

class Array {
    public:
        Array();
        int operator[](int idx);
    private:
        int arr[10];
};

int Array::operator[](int idx) {
    std::cout << "ok";
    return arr[idx];
}

#endif

我试图创建一个对象

#include "test.h"
#include <iostream>

int main() {
    std::cout << "Create" << std::endl;
    Array obj();
    int i = obj[0];

    return 0;
}

为什么我会收到错误

main.cpp: In function ‘int main()’:
main.cpp:7:18: warning: pointer to a function used in arithmetic [-Wpointer-arith]
     int i = obj[0];
                  ^
main.cpp:7:18: error: invalid conversion from ‘Array (*)()’ to ‘int’ [-fpermissive]

为什么不使用我的operator[]

2 个答案:

答案 0 :(得分:1)

Array obj();

是一个没有参数且返回类型为Array的函数声明。

只需写下

Array obj;

考虑到如果你想使用运算符为数组的元素赋值,那么当它返回对元素的引用时会更好

int & operator[](int idx);

您也可以为常量对象声明此运算符

const int & operator[](int idx) const;

int operator[](int idx) const;

答案 1 :(得分:0)

这被视为函数声明而不是对象。

Array obj();

替换为

Array obj;