2012-06-20 2 views
2

은 여기, 한 종류의 paramenter 한 부울과 템플릿 클래스를 작성하는 코드입니다 오전 :부분 템플릿 전문화의 문제점은 무엇입니까?

template<class T, bool p = true> 
class A 
{ 
private: 
    T* ptr; 
public: 
    A(); 
}; 


template<class T> 
A<T,true>::A() 
{ 
    ptr = 0xbaadf00d; 
} 

int main() 
{ 
    A<int> obj; 
    A<int, false> o; 
    return(0); 
} 

그리고 나는이 컴파일 오류가 점점 오전 :

Error 1 error C3860: template argument list following class template name must list parameters in the order used in template parameter list tst.cpp 15 
Error 2 error C2976: 'A<T,p>' : too few template arguments tst.cpp 15 

내가 잘못하고있는 중이 야 무엇을? 또는 non-type 매개 변수를 부분적으로 특수화하는 것이 금지 된 이유는 무엇입니까? ...

나는 사물의 종류의 전문화를 어떻게해야하고 그래서

Warning 1 warning C4127: conditional expression is constant 

: 동시에

내가 if 문에서 부울 매개 변수를 사용하는 경우,이 경고를 받고 있어요

도움이 되었으면 좋겠습니다. :)

미리 감사드립니다 !!!!

답변

5

메소드를 부분적으로 특수화하려고합니다. 그건 허용되지 않습니다. 전체 수업을 부분적으로 만 전문화 할 수 있습니다. 클래스를 특수화 한 후에는 부분적으로 특수화 된 클래스에 대해 메소드의 비 전문화 된 정의를 제공 할 수 있습니다.

template<class T, bool p = true> 
class A 
{ 
private: 
    T* ptr; 
public: 
    A(); 
}; 

template <class T> 
class A<T,true> { 
private: 
    T* ptr; 
public: 
    A(); 
}; 


template <class T> 
class A<T,false> { 
private: 
    T* ptr; 
public: 
    A(); 
}; 

template<class T> 
A<T,true>::A() 
{ 
    ptr = reinterpret_cast<T *>(0xbaadf00d); 
} 

template<class T> 
A<T,false>::A() 
{ 
    ptr = 0; 
} 

int main() 
{ 
    A<int> obj; 
    A<int, false> o; 
    return(0); 
} 
+0

고마워요 !!! – Serge

6

형식이 아닌 템플릿 매개 변수는 전문화 할 수 있지만 템플릿 클래스의 한 가지 기능 만 전문으로 할 수는 없습니다. 클래스이 템플릿이기 때문에 클래스이 특화되어야합니다. 즉, 생성자에 대한 특별한 정의를 제공하려면 전체 클래스에 대한 특별한 정의를 제공해야합니다.

+1

그냥 좀 더 정확히 말하면 :

다음은 원하는 것을 할 수있는 몇 가지 코드의 예입니다 난 그냥 하나 개의 기능, 전체 전문화 확인 작업 부분적으로 전문화 할 수 없습니다 – Serge

+0

감사합니다! ! 한 가지 언급 만합니다. 한 가지 기능을 일부만 전문적으로 수행 할 수는 없습니다. 전체 전문화가 잘 작동합니다. 그게 나를 놀라게 한 것입니다 ... – Serge

관련 문제