Почему это статическое утверждение не работает?

Я пытаюсь использовать статическое утверждение до C++11. Я нашел этот и этот вопрос, но почему-то не могу его запустить:

#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);    
}

Компиляция этого (GCC) приводит к

ошибка: размер массива "пустышка" отрицателен

Я ожидаю, что эта ошибка появится, только если я позвоню setValue с чем-либо, кроме int, Я также попробовал другие предложенные решения, но с более или менее одинаковым результатом: ошибка есть, даже если я не создаю экземпляр шаблона с чем-либо, кроме int, Что я делаю неправильно?

1 ответ

Решение

Если шаблон недействителен для каждого экземпляра, значит, программа некорректна, диагностика не требуется. Таким образом, 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); }
Другие вопросы по тегам