2016-10-12 1 views
3

pre-C++ 11 정적 어설 션을 사용하려고합니다. 나는 thisthis 질문을 찾았지만, 어떻게 든 그것을 실행 얻을 캔트 :이 정적 어설 션이 작동하지 않는 이유는 무엇입니까?

#define STATIC_ASSERT(x) \ 
    do { \ 
     const static char dummy[(x)?1:-1] = {0};\ 
    } while(0) 

struct bar { 
    int value; 
    template<typename T> void setValue(T x); 
}; 
template<typename T> void bar::setValue(T x) { STATIC_ASSERT(1==0); } 
template<> void bar::setValue(int x) { value = x;} 

int main(){ 
    bar b; 
    int c = 1; 
    b.setValue(c);  
} 

나는 아무것도 setValue를 호출하면 나는이 오류는 apprear 기대

error: size of array 'dummy' is negative

이 (GCC)를 컴파일 결과 int 이외. 나 또한 다른 제안 된 솔루션을 시도했지만 더 많거나 적은 같은 결과 : int 이외의 다른 템플릿으로 인스턴스화하지 않더라도 오류가 있습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

, 당신이이 경우에 모든 템플릿을 사용하지 않아도 알고, 단순히'int' 유형으로 쓰기 그냥 궁금해서? (교육적인 이유로 여전히 흥미로운 질문과 답변이지만, 실제 사용법은 사소한 것이 아니기를 바랍니다 :)). – Ped7g

+0

@ Ped7g 글쎄, 사실 내 실제 사용 예제로 사소한 것입니다. 필자는 함수가 올바른 유형의 매개 변수로 호출되고 변환이 수행되지 않는다는 것을 절대적으로 확신하고자합니다. 이것이 좋은 접근인지 아닌지는 아직 확실하지 않지만 여기에 대한 토론이 아닙니다. 내가 codereview에 넣을 것이다 ... – user463035818

+0

explict 키워드를 찾는다. – UKMonkey

답변

7

템플릿이 모든 인스턴스화에 대해 유효하지 않은 경우 프로그램이 잘못 구성되어 진단이 필요하지 않습니다. GCC는 따라서 템플릿 인수가 무엇이든 setValue의 기본 템플릿이 유효하지 않으므로 여기서 오류를 완벽하게 유효하게합니다.

이 문제를 해결하는 방법은 STATIC_ASSERT 표현식을 템플릿 매개 변수에 종속시키는 것입니다. 하나의 옵션은이 같은 dependent_false 템플릿 클래스를 만드는 것입니다 :

template <typename T> struct dependent_false 
{ const static bool value = false; }; 

template<typename T> void bar::setValue(T x) 
{ STATIC_ASSERT(dependent_false<T>::value); } 
+0

"특수화가 부적절한 경우에도 템플릿이 모든 인스턴스화에 대해 유효하지 않으면 프로그램이 잘못 구성됩니다. – user463035818

+1

@ tobi303 그래 ... – TartanLlama

+0

오케이, 알았어.하지만 해킹이 조금 이상하다고 느껴진다. 컴파일러가 "충분히 똑똑하다"면 그는 템플리트가 불량인지 알 수 있습니다. T – user463035818

관련 문제