2014-12-04 4 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 유형의 객체를 반환한다고 가정하고 부울 유형 변수를 반환하는 연산자 []를 무시합니다. 컴파일러가 적절한 오버로드 된 연산자 []를 사용할 때 "알 수 있도록"코드를 수정할 수 있습니까?

+1

컴파일러는'tab [2]'를 기반으로 호출 할 함수를 찾아 내려고 시도합니다. 이후까지'bool b ='부분을 보지 않습니다. –

답변

2

bool을 반환하는 오버로드는 const이므로 상수 C 개체에 적용 할 때만 사용됩니다. 너의 것은 const이 아니기 때문에, const 과부하가 선택되지 않습니다. 그래서

operator bool() const {return v;} 

을 당신도 오버로드를 사용하여 같은 방법으로 bool 값을 읽을 수 :

하나의 해결책은 bool-ref이 암시 적으로 변환하는 것입니다.

+0

남자, 당신은 신사이고 학자입니다. – user2648421

2

두 개의 구현이 operator[] ... const 개의 오브젝트와 비 const 오브젝트의 오브젝트 중 하나입니다. 귀하의 메인은 C의 비 const 인스턴스를 가지고 있으므로 ref을 반환하는 비 const 연산자를 호출합니다.