1

이 문제와 관련된 몇 가지 질문을 보았습니다. 그러나 그들 모두는이 문제를 해결하기위한 STL 특정 트릭을 논의하는 것으로 보입니다. 다음은 간단한 문제의 예입니다. 우리가 어떤 연산자를 오버로드하는 클래스를 사용하는 가정, 표준 : : 벡터 과부하 말 [] 연산자 :조사 식 창에서 과부하 된 연산자로 표현식을 평가할 수 없습니다.

vector<int> v; 
v.push_back(1); 
v.push_back(2); 
v.push_back(3); 

auto x = v[0]; 

이 경우 오버로드 된 연산자 v[0]를 호출하는 식을 평가하기 위해 노력하고, VC++에서 다음과 같은 오류를 보여줍니다 Watch Window에서 :

v[0] no operator "[]" matches these operands  

내 첫번째 추측은 디버거가 인수의 유형을 알아낼 수 있었다, 그래서 나는 코드에 다음과 같은 수정과 v[(size_type)0] 표현하고이 ((intvector)v)[(size_type)0] 표현식을 평가하는 시도 :

typedef vector<int> intvector; 
intvector v; 

행운이 없습니다. 다시 같은 오류 메시지가 나타납니다.

운영자 호출의 확장 된 형식 (여기에 올바른 용어인지 확실하지 않음)을 사용하면 작동합니다 : v.operator[](0) 때문에 이상합니다. 그리고 STL 클래스뿐만 아니라 [] 연산자를 오버로드하는 클래스에 대해서도 보편적으로 작동하는 것으로 보입니다.

두 가지 형태로 v[0]v.operator[](0)은 동일해야하지만 VC++는 다르게 생각하는 것 같습니다. 그들은 정말로 다른가요? VC++ 디버거가 짧은 양식을 평가할 수없는 이유는 무엇입니까? "확장 된"양식에는 아무런 문제가 없습니다. 이 주위에 어떤 방법이 있습니까? 나는 아주 작은 코드를 복사하고 그것을 Watch Window에서 평가하는 데 익숙하다.

답변

0

const 및 사용 가능한 const 버전이 있으면 Visual Studio의 디버거식이 오버로드 된 연산자를 지원하지 않습니다. 이 부분은 page on MSDN입니다.

디버거는 const 및 non-const 버전을 모두 포함하는 오버로드 된 연산자를 지원하지 않습니다. const 및 non-const 버전을 사용하는 오버로드 된 연산자는 표준 템플릿 라이브러리에서 자주 사용됩니다.

+0

VS는 클래스에 'const' 버전이 하나만 있어도 표시되지 않습니다. 동시에'const' 연산자와 non-'const' 연산자를 모두 구현하는 클래스에서는 잘 작동하지만 연산자는'operator' 키워드를 사용하여 함수로 호출됩니다. 그것이 질문의 요점입니다. – Max