2011-11-08 2 views
0

다음은 MSVC++ 10 Sp1에서 "내부 컴파일러 오류"를 제공합니다. 부분 및 명시 적 템플릿 특수화의 이상한 오류

그리고 GCC에

: 16 : 12 : 오류 : b.cpp

비 네임 스페이스 범위에 명시 적으로 전문화

'A ::의 B를 구조체'b.cpp : 16 : 28 : 오류 : struct B 전에 코멘트가 컴파일 제거하면 템플릿 ID는,

//class template 
template< class T> 
struct A{ 

    //struct B {}; //Remove the comment and it will compile! 
}; 

//partial specialization 
template< class T > 
struct A< T* > 
{ 
    struct B { 

     template<class C> void f(){} 

      //"Internal Compiler Error" 
     template<>   void f<int>(){}; 

    }; 
}; 

그러나 기본 템플릿의 선언에 'F'!

나는이 문제를 이해하지 못한다!

+2

첫째,이 컴파일되어 있지 않습니다. 그리고 당신은 버그 보고서를 제출해야합니다. 여기에 아무런 문제가 없으며 소스가없는 코드의 버그를 설명 할 수 없습니다. –

+0

주석을 제거한 상태에서 컴파일하면 안됩니다. –

+0

가능한 [템플릿 클래스의 템플릿 함수를 명시 적으로 특수화하기위한 C++ 구문?] (http://stackoverflow.com/questions/2097811/c-syntax-for-explicit-specialization-of-a-template-function -in-a-template-clas) –

답변

2

코드에 버그가있어 MSVC++에서이 코드를 처리하지 못했습니다. gcc 컴파일 결과는 다음과 같습니다.

$ make parspec.o 
g++ -c -o parspec.o parspec.cc 
parspec.cc:17: error: explicit specialization in non-namespace scope ‘struct A<T*>::B’ 
make: *** [parspec.o] Error 1 

즉, 클래스 나 구조체를 전문으로 만들 수 없습니다.

편집 : MSVC++에서 이러한 부적합한 구문을 허용한다는 것을 알리는 Google의 빠른 답변이 있지만 그다지 잘 수행하지 못했을 것입니다.

+0

그러나 표시된 주석이 제거되면 컴파일되는 사실은 어떨까요? –

+0

@ user578832 : GCC의 버그입니다. 컴파일해서는 안됩니다. –

+0

@ user578832 : 오랫동안이 물건을 보지 않았기 때문에 아마도 내 기억이 나빠질 수 있습니다.하지만 마지막으로 확인했을 때, 표준에서 허용하지 않았 음을 확신합니다. –

0

클래스 템플릿의 여러 인스턴스에 대해 멤버 함수를 특수화 할 수 없습니다. 이 허용됩니다 :

template<typename T> 
struct A{ 
}; 

template<typename T> 
struct A<T*> 
{ 
    struct B { 
     template<class C> void f(); 
    }; 
}; 

template<typename T> 
template<typename C> 
void A<T*>::B::f() {} 

template<> 
template<> 
void A<char*>::B::f<int>() {} 

하지만이되지 않습니다 :

template<typename T> 
template<> 
void A<T*>::B::f<int>() {} 
관련 문제