2009-06-05 4 views
0

다음 코드는 VC6에서 정상적으로 컴파일되지만 VS2008에서 같은 프로젝트를 컴파일하면 다음과 같은 오류가 발생합니다. 오류 : C2146 : 구문 오류 : ';'가 없습니다. 식별자 'm_pItr'앞에누락; before identifier VC9에서 VC6 코드를 컴파일하는 동안

template <class pKey, class Data, class pCompare, 
      class hKey = int, class hCompare = less<hKey>, 
      class sKey = int, class sCompare = less<sKey>, 
      class tKey = int, class tCompare = less<tKey>, 
      class cKey = int, class cCompare = less<cKey>> 

class GCache 
{ 
    private: 

     typedef map<pKey, Data, pCompare> PRIMARY_MAP; 
     PRIMARY_MAP pMap; 

     PRIMARY_MAP::iterator m_pItr; //error here 

//Code truncated 
} 

무엇이 잘못 되었습니까? VC6에서 VC2005/2008로 C++ 코드를 마이그레이션 한 경험이있는 분이라면 도움이 될 것입니다.

+0

이 매크로는 무엇입니까 PRIMARY_MAP :: iterator? – yesraaj

+0

매크로가 아닙니다. 코드의 typedefin입니다! –

+0

올바른 일치 ..... – yesraaj

답변

6

컴파일러에게 PRIMARY_MAP :: iterator가 어떤 경우에 하나의 유형이라고 알려면 'typename'을 삽입해야 할 수 있습니다.

class GCache 
{ 
    private: 

     typedef map<pKey, Data, pCompare> PRIMARY_MAP; 
     PRIMARY_MAP pMap; 

     typename PRIMARY_MAP::iterator m_pItr; 

//Code truncated 
} 
+0

완벽! Tobi에게 감사드립니다. VC6에서 왜 필요하지 않은지 설명 할 수 있습니까? – bobbyalex

+1

죄송합니다. 정확히 모르겠습니다. VC6 컴파일러의 버그라고 가정합니다. 나는 VC6이 템플릿과 관련된 모든 것을 지원하는 것 (예 : 부분적인 전문화)에 가까이 오지 않았 음을 확신한다. – Tobi

+1

VC6은 표준 준수 컴파일러 근처에 아무것도 없기 때문에 VC6에서 필요하지 않았다. 컴파일러가 출시되었을 때 템플릿과 STL은 아직 완성되지 않았으므로 컴파일러가 버그를 겪고 있지 않고 스펙을 따르지 않는 것 외에는 * 시도 할 표준 *이 실제 언어 표준과 다릅니다. – jalf

1

당신은 공통 템플릿 문제의 희생양이 될 수있다

class cKey = int, class cCompare = less<cKey>> 

은 다음과 같아야합니다

class cKey = int, class cCompare = less<cKey> > 

참고 llast이 꺾쇠 괄호 사이의 공간.

+0

그건 vc6 오른쪽에서 발생합니까? – yesraaj

+0

나는 이것이 C++ 표준으로 인해 VC9가 표준을 따르고 VC6이 그렇지 않을 가능성이 높다고 생각합니다. C++ 0x 표준은 >>를 허용합니다. – OregonGhost

+0

사실 인 경우 믿을 수 없습니다. – kenny

3

typename PRIMARY_MAP::iterator m_pItr;해야한다. 그렇지 않으면 컴파일러는 PRIMARY_MAP :: iterator가 정적 객체이며이를 유형으로 인식 할 수 없다고 생각합니다. 따라서 컴파일러가 정적 객체가 아니라 유형임을 나타내는 힌트를 컴파일러에 제공해야합니다.

+0

이 컴파일러 문제는 VC9에서만 존재합니까? – bobbyalex

+0

아니요 '버그'가 아닙니다. 그것이 표준이되는 방식입니다. 그것은 VC6에서 컴파일 할 수 있지만 VC6은 템플릿과 관련하여 끔찍한 컴파일러입니다. 그것은 완전히 다른 무언가를하고있을 수 있습니다 .. VC6에서 컴파일 될 때 나는 템플릿과 관련된 것을 믿지 않을 것입니다. – Naveen

관련 문제