2010-07-21 3 views
2

다음 코드를 고려하시기 바랍니다. bar이 중첩 템플릿이 아닌 경우 위 구문은 정상적으로 작동합니다. 내가 예를 들어 할 때템플릿 친구와 중첩 된 클래스

int main() 
{ 
    foo<int> x; 
} 

MSVC8 (비주얼 C++ 2005)을 좋아하지 않는다 :

1>.\main.cpp(11) : error C3855: 'foo<T>::bar': template parameter 'S' is incompatible with the declaration 
1>  .\main.cpp(12) : see reference to class template instantiation 'foo<T>::bar<S>' being compiled 
1>  .\main.cpp(14) : see reference to class template instantiation 'foo<T>' being compiled 

을 내가 대신

template <typename> friend struct foo<T>::bar; 

을 사용하는 경우 컴파일러는 나에게 같은 오류를 제공합니다 . 내가 원하는 것을 어떻게 얻을 수 있습니까?

편집 :이는 것 같다 나는 (여기의 아침, 나는 정말 깨어 아니에요) 검사의 double VC8 bug :

+4

내 컴퓨터에서 작동하는 것 같습니다. 그래도 같은 컴파일러. – DumbCoder

+0

위의 정확한 코드를 복사하고 포함하지 않으며 복사 한 다음 오류 메시지를 붙여 넣습니다. –

답변

2

클래스 또는 클래스 템플릿의 친구에 대한 모든 제한이 섹션 14.5.3에 설명되어 있습니다 C++ 표준. 귀하의 코드가 유효합니다. Visual Studio 용 최신 서비스 팩을 모두 설치했는지 확인하십시오. Here Visual Studio에서 관련 버그를 찾을 수 있습니다.

+0

감사합니다. 실제로 VC8 버그 인 것 같습니다. 불행히도 저는 컴파일러를 변경할 수 없으므로 공개 멤버들과 함께 할 것입니다. –

+0

[This] (https://connect.microsoft.com/VisualStudio/feedback/details/262353/compile-error-when-making-a-template-class-a-friend-of-itself-works-on-vc7 -1-and-gcc-3-4-4 # 세부 사항) 버그는 동일한 문제 일 가능성이 큽니다. VC8 용 서비스 팩 설치를 고려하십시오. –