Я попытался использовать это предложение для статического утверждения, но я не получаю ошибки компиляции, если использую его в метод шаблона.
Следующий пример:
#include <iostream>
#define STATIC_ASSERT(expr, msg) \
{ \
char STATIC_ASSERTION__##msg[(expr)?1:-1]; \
(void)STATIC_ASSERTION__##msg[0]; \
}
template <typename T >
class A
{
public:
int foo(const int k )
{
// does not work
STATIC_ASSERT( k > 9, error_msg );
return k+5;
}
};
int bar(const int k )
{
// works fine
//STATIC_ASSERT( k > 9, error_msg );
return k+5;
}
int main()
{
A<int> a;
const int v = 2;
std::cout<<a.foo(v)<<std::endl;
std::cout<<bar(v)<<std::endl;
// works fine
//STATIC_ASSERT( v > 9, error_msg );
}
Я скомпилировал его с помощью g ++ 4.7.2 с предупреждением, что VLA не поддерживаются c ++ ISO:
g++ -Wall -g -std=c++98 -Wextra -pedantic gvh.cpp
Итак, почему компиляция не завершается неудачно, когда STATIC_ASSERT используется в методе шаблона? Есть ли способ заставить его потерпеть неудачу?
ПРИМЕЧАНИЕ. Мне нужно решение c ++ 98 (возможно, даже c ++ 03), если возможно, только с макросами.
const int
не означает, что это константа времени компиляции - это просто означает, что функция принимает копию аргумента среды выполнения и не позволяет вызываемому коду изменять его. Вам нужно будет принятьk
в качестве параметра шаблона (либо дляA
, либо сделавA::foo
atemplate <int K>
, или, может быть, возиться с C ++ 11constexpr
, чтобы получить ожидаемую вами проверку времени компиляции. - person Tony Delroy   schedule 31.01.2013