2014-12-04 5 views
1

Я написал следующий код и столкнулся с проблемой перегрузки оператора []. Вот код для testmain.cpp:Проблемы с оператором перегрузки []

#include"test.hpp" 

int main() 
{ 
    C tab = C(15); 
    bool b = tab[2]; 
    return 0; 
} 

А вот файл заголовка test.hpp:

#ifndef _test_ 
#define _test_ 
class C 
{ 
    friend class ref; 
    int s; 
public: 
    class ref 
    { 
    public: 
     bool v; 
     ref(); 
     ref(bool x); 
     ref& operator = (ref a); 
     ref& operator = (bool x); 
    }; 
    C(); 
    C(int a); 
    bool operator[] (int i) const ; 
    ref operator[] (int i); 
}; 
#endif ///_test_ 

При попытке компиляции кода, я получаю следующее сообщение об ошибке:

testmain.cpp: In function ‘int main()’: 
testmain.cpp:6:16: error: cannot convert ‘C::ref’ to ‘bool’ in initialization 

Похоже, что компилятор автоматически предполагает, что мой оператор индексирования [] всегда возвращает объект типа ref и игнорирует оператор [], который возвращает переменную типа boolean. Можно ли исправить код так, чтобы компилятор «знал», когда использовать соответствующий перегруженный оператор []?

+1

Компилятор пытается определить, какую функцию вызывать, основываясь исключительно на 'tab [2]'. Он не смотрит на часть 'bool b =' до тех пор, пока впоследствии. –

ответ

2

Перегрузка, возвращаемая bool, равна const, поэтому будет использоваться только при приложении постоянного объекта C. У вас нет const, поэтому выбрана перегрузка не const.

Одним из решений является сделать ref неявно конвертируются в bool:

operator bool() const {return v;} 

так что вы можете прочитать значение bool таким же образом, используя либо перегрузку.

+0

Человек, ты джентльмен и ученый. – user2648421

2

У вас есть две реализации operator[] ... один для const объектов и один для объектов, не являющихся объектами. У вашей основной есть неконстантный экземпляр C, поэтому он вызывает неконстантный оператор, который возвращает ref.

Смежные вопросы