2012-02-10 2 views
3

템플릿을 사용하여 다양한 프로파일 클래스를 작성 중이며 구조체 tm으로 표시되는 숫자 인덱스 또는 날짜와 시간으로 프로필을 인덱싱하려고합니다. 숫자 인덱스에 의한 인덱싱은 정상적으로 작동하지만 날짜에 의한 인덱싱은 개체에 대한 포인터와 함께 작동하지 않습니다. 다음은 작동하는 접근법과 작동하지 않는 접근법을 포함하는 샘플 코드입니다.C++ 객체에 대한 포인터가 주어지면 operator [] 함수를 호출하는 올바른 방법은 무엇입니까?

#include "profile.h" // Class Profile<T> is declared and defined here. 
float f; 
int i; 
struct tm d; 
Profile<float> p; 
Profile<float> *pPtr; 

// Non-pointer syntax 
f = p[i];    // this works. 
f = p.operator[](i);  // this works, but its ugly. 
f = p[d];    // this works. 
f = p.operator[](d);  // this works, but its ugly. 

// Pointer syntax 
f = (*pPtr)[i];   // this works. 
f = pPtr->operator[](i); // this works, but its ugly. 
f = (*pPtr)[d];   // this isn't what I typed. I did f = *(pPtr)[d]; 
f = pPtr->operator[](d); // this works, but its ugly. 

이 C++ 코드는 컴파일러 에러 메시지가 오류 C2677이고 비주얼 스튜디오 2008에 기록되는 이진 '['전역 연산자 (또는 허용 가능한 전환 없음) 'TM'를 입력 취하는 발견.

C++ 객체에 대한 포인터가 주어지면 operator [] 함수를 호출하는 올바른 방법은 무엇입니까?

+2

'f = (* pPtr) [d]; // 이것은 효과가 없다.'나는 그것이 작동한다는 것을 보증 할 것이다; 어떤 오류가 보이십니까? – ildjarn

+0

'(* pPtr) [d]'가 작동하지 않는다는 것은 무엇을 의미합니까? '* pPtr'가'Profile &'을 낳기 때문에'p [d]'에 받아 들여지는 구독 연산자를 받아 들여야합니다. –

+0

정말 이상합니다! 4 시간 동안 고생하고 일관된 컴파일러 오류가 발생하면 이제 작업이 시작됩니다. @^P –

답변

2

여기에 표시된 코드는 정상입니다. 아마도 이전 시도에서 *(pPtr)[d] 대신 (*pPtr)[d]을 수행했는데 operator*operator[]보다 우선 순위가 낮기 때문에 오류가 발생할 수 있습니다.

+0

특히 * (pPtr) [d]하고있었습니다. –

1

현명한 옵션을 나열했습니다. 왜 포인터 역 참조가 작동하지 않을지 모르겠다. 다음은 잘 컴파일됩니다.

std::vector<int> v; 
v.push_back(0); 
v[0]; 

std::vector<int>* vp = &v; 
(*vp)[0]; 
+0

예, 광산도 컴파일됩니다. 나는 왜 컴파일 에러 C2677을 얻었는지에 대한 설명이 없다. –

0

비슷한 경우 클래스에 'at'와 같은 메소드를 추가합니다.

templateType & Profile::at(int idx) 
{ 
    return operator[](idx); 
} 

그래서, 코드는 더 나은 같습니다

f = pPtr->at(i); 

을 그건 그렇고, operator[](idx) 쉬운 것 클래스의 메소드 (IDX) (우리의 경우 프로필)에서 사용.

관련 문제