Почему это статическое утверждение не работает?
Я пытаюсь использовать статическое утверждение до 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); }