2010-07-21 6 views
1

두 가지 방법을 전문으로하는 템플릿 클래스가 있습니다. 어떤 이유로 구조체에 대한 특수화를 추가하면 bool의 전문화와 상충되는 것으로 보입니다. struct = bool (잘못된 특수화로 해결)을 설정하려고하기 때문에 형식 변환 오류가 발생합니다.구조체 및 bool로 템플릿 전문화

typedef struct foo { 
    ... 
} 

template <class T> class bar { 
    template <class T> void method1() {...} 
    template <> void method1<bool>() {...} 
    template <> void method1<foo>() {...} 
} 

통화 당

template class bar<bool>; 
template class bar<foo>; 

method1<foo>에 해결하는 대신 T = foo는 설정 때문에 내가 method1<bool> 내부 오류가 점점 오전 : 여기에 몇 가지 코드

.H입니다.

아이디어가 있으십니까?

+0

포스트 실제 코드. –

답변

1

(EDITED)

다음을 시도 할 수있는 대표 템플릿 기반 도우미 클래스에 메소드 구현.

.H :

typedef struct Foo { 
    ... 
} 

template<class T_Bar, class T2> struct BarMethod1; 
template <class T> class Bar 
{ 
    template<class T2> void method1(...) 
    { 
     BarMethod1<Bar, T2>(...)(...); 
    } 
} 
template <class T_Bar, class T2> class BarMethod1 
    {void operator()(...){...}}; 
template <class T_Bar> class BarMethod1<T_Bar, bool> 
    {void operator()(...){...}}; 

template <class T_Bar> BarMethod1<T_Bar, Foo> 
    {void operator()(...){...}}; 

통화 당

template class Bar<bool>; 
template class BarMethod1<Bar<bool>, bool>; 
template class BarMethod1<Bar<bool>, Foo>; 
template class Bar<Foo>; 
template class BarMethod1<Bar<Foo>, bool>; 
template class BarMethod1<Bar<Foo>, Foo>; 
+0

정확하게 똑같은 문제점을 겪습니다 : 외부 템플릿을 전문화하지 않고 내부 템플릿을 명시 적으로 전문화하려고 시도합니다. 심지어 어떤 컴파일러가 그것을 받아들이더라도 여전히 유효하지 않은 C++입니다. – AnT

+0

정말요? 나는 놀랍다. 그러나 나는 논쟁하지 않는다. 나는 표준 전문가가 아니다. –

+0

이 새 버전은 어떻습니까? –

3

코드의 첫 번째 부분이 이미 잘못되었습니다. C++은 포함 템플릿을 명시 적으로 특수화하지 않고 "중첩"(멤버) 템플릿을 명시 적으로 특수화하는 것을 지원하지 않습니다.

코드 컨텍스트에서 명시 적으로 전체 클래스 템플릿 bar을 전문화하지 않고 템플릿 메서드 method1을 명시 적으로 특수화하는 것은 불법입니다.

회원 템플릿 함수 member1이 일부 매개 변수에 의존하는 경우 템플릿 특수화 대신 오버로드를 사용하여 문제를 해결할 수 있습니다. 그러나 그렇지 않기 때문에 어떻게 든 템플릿을 재 설계해야합니다. 위에서 한 일은 C++에서 다시 한번 불법입니다.

오류가 발생하면 쉽게 원래 문제로 인해 발생할 수 있습니다.

P. 게시 한 문제에 대한 설명은 코드가 컴파일됨을 의미합니다. 위에서 설명한 이유 때문에 게시 한 내용을 컴파일해서는 안됩니다. 이는 가짜 코드를 게시하고 있음을 나타냅니다. 실제 코드 게시.

+0

사실, 다른 유형에서도 잘 작동했습니다. 일단 구조체 전문화를 추가하면 오류가 발생합니다. – AdamC

+0

@AdamC : 때때로 컴파일러는 표준을 따르지 않는 코드를 인정합니다. 분명한 이유로이 동작에 의존하는 것은 매우 위험합니다. –

+0

@AdamC : 단순히 컴파일러가 C++ 언어와 관련이없는 확장 된 기능을 제공한다는 의미입니다. 언어로 관리되지 않기 때문에 기능이 어떻게 작동하는지 예측하기는 어렵습니다. 어쩌면 당신이 관찰 한 것은 의도 된 동작 일 수도 있고 아닐 수도 있습니다 ... 컴파일러의 문서를 참고하십시오. 다시 한번 말하지만 이것은 C++가 아닙니다. – AnT

관련 문제