2012-01-06 2 views
0

몇 년 후 C++이 날의 지옥을 혼란 .. 내 클래스는연산자 + 혼란 (참조 대 포인터)

virtual CStatCounter& operator= (CStatCounter const& inSC); 

virtual CStatCounter operator+(const CStatCounter& rhs); 

를 구현하고 나는

을 유지하고있어
vector<CStatCounter*> mStatistics 

어딘가에 있습니다. 이제 내가하려는 것은 모든 가치를 누적하는 것입니다. 표준에 의해 비웃었다 된 후 이 : 난 내 자신, 여전히 행운에 압연 간단한 루프로 전환했습니다 축적 :

CStatCounter *iniCounter = new CStatCounter(0); 
BOOST_FOREACH (CStatCounter *counter, mStatistics) 
{ 
    iniCounter = iniCounter+counter; 
} 

컴파일러 (엑스 코드 4.2/연타)은 약

Invalid operands to binary expression ('CStatCounter *' and 'CStatCounter *') 
불평

루프 본체를 counter + counter로 변경할 수 있으며 여전히 같은 오류 메시지와 함께 실패합니다.

참조와 포인터를 암시 적으로 변환하는 것이 현명하지 않아야합니까? 나는 여기에 사소한 것을 놓치고 있니?

+2

나는 당신의 더하기 연산자는'bool' 아닌'CStatCounter' – Hoons

+0

안녕 제이,하지 질문에 대한 답변을 반환하는 이유에 혼란 스러워요하지만 :: ptr_vector 대신 표준의 :: 포인터 대신 포인터 대신 참조를 반복합니다. 이 상황을 피했을까요? – Dennis

+0

왜냐하면 .. 나는 카피 & 붙여 넣기에 너무 까다 롭다 !!!!도 오! 고마워. 물론 CStatCounter를 반환해야합니다 ... – Jay

답변

4

포인터와 참조를 암시 적으로 변환 할만큼 똑똑하지 않아야합니까?

하지만 C++이 아니겠습니까? 상상할 수있는 모든 피연산자의 조합에 대해 연산자를 과부하 할 수있는 경우 이러한 가정을하는 것이 안전하지 않습니다.

내가 여기 뭔가 사소한 것이 있습니까?

역 참조 :

*iniCounter = *iniCounter + *counter; 

을 그건 그렇고, 당신은 여전히 ​​표준을 사용할 수 있습니다 :: 축적, 당신은 다음과 같이 정의 이항 연산이 필요합니다

CStatCounter MyAddFunc(const CStatCounter & lhs, const CStatCounter * rhsp) 
{ 
    return lhs + *rhsp; 
} 

*iniCounter = std::accumulate(mStatistics.begin(), mStatistics.end(), 
           *iniCounter, MyAddFunc); 
+0

* 한숨 * 그리고 컴파일러가 될 수 있기를 바랬다. ~ ~. 대답 ;-) – Jay

3

어때 대략 *iniCounter = *iniCounter + *counter;?

사이드 노트에서 모든 포인터와 가상이 정말로 필요한가요?

+0

실제 통계를 유지하는 파생 클래스를위한 기본 클래스입니다! – Jay

+0

카운터가 항상 내 물건을 복사하는 STL을 싫어하는 한. 이 단순한 시나리오 (인스턴스 당 하나의 int 또는 double 멤버)에서는 아무 것도 걱정할 필요가 없을 것입니다. – Jay

+0

operator +가 bool을 반환하면이 방법을 사용할 수 있습니까? – antlersoft

2

가 암시 적 없다 여기에서 전환.

정확한 오버로드를 제공해야합니다.

virtual bool operator+(const CStatCounter* rhs); 
virtual CStatCounter& operator= (CStatCounter const* inSC); 

또는 제공 한 과부하와 일치하도록 코드를 수정하십시오. 당신이 부스트를 사용한 경우

*iniCounter = *iniCounter + *counter; 
+0

가끔은 C++가 싫어. 어쨌든 고마워. – Jay

+0

@ 제이 : 나를 위해 그것의 보통 사랑은 시간의 대부분을 싫어합니다 :) –