2011-12-02 4 views

답변

7

한 가지 방법은 기본 구현을 제공하지 않고 허용하려는 유형에만 클래스 템플릿을 전문화하는 것입니다. 예를 들어 :

#include <iostream> 
using namespace std; 

template<class X> class Gizmo 
{ 
public: 
    Gizmo(); 
}; 

template<> Gizmo<int>::Gizmo() 
{ 
} 

int main() 
{ 
    Gizmo<float> gf; // ERROR: No specialization for Gizmo<float> results in a linking error 
} 
3

는 현재 Restrict Template Function

는 대답 그래서 내가 덧글을 남길 수 없습니다 ...

+1

좋은 대답, 일을 분명히하기 위해, 예 : 'struct No {}; struct Yes : public No {}; 템플릿 구조체 myfunction_allower {enum {value = true}; }; template <> struct myfunction_allower {enum {value = false}; }; 템플릿 void myfunction (T) {static_assert (myfunction_allower :: 값, "허용되지 않는 유형"); } void test() {myfunction (1.); struct 아니요 아니요; myfunction (no); // 오류 C2338 : 형식이 허용되지 않습니다 struct 예 예; myfunction (예); // 작동합니다 : 금지는 전이가 아닙니다.' – reder

3

확인할 수 있습니다 불법 유형에 생성자 개인하십시오 :

template<typename T> 
class Z 
{ 
public: 
    Z() {} 
}; 

template<> 
class Z<int> 
{ 
private: 
    Z(); 
}; 

Z<float> f; // OK 
Z<int> i; // Compile time error. 
+0

전문화를 완료하지 않은 상태로 두는 것이 더 간단하지 않고 여전히 트릭을 수행 할 수 있을지 궁금합니다. – UncleBens

+0

@UncleBens, 그게 링커 오류를 일으킬 것이다 (나는 이것이 무엇을 의미하는지 생각한다 :'template <> class Z {public : Z();}. . – hmjd

+1

아니,'template <> class Z ; '컴파일 타임에 불완전한 타입을 인스턴스화해서는 안된다. (기본 템플릿은 불완전한 채로 남아 있다면 .) – UncleBens

관련 문제