Ошибка инициализации размера массива с использованием статической переменной const шаблона класса - PullRequest
1 голос
/ 08 июля 2019
template<typename T, typename C = vector<T>>
class stack{
    ...
    friend class stack_array;
};

template<typename T, typename C = vector<T>, typename K = stack<T,C>>
class stack_array{
     ...
     static const size_t max_elem;
     array<K, max_elem> store;
     ...
};

template<typename T, typename C = vector<T>, typename K = stack<T,C>>
const size_t stack_array<T,C,K>::max_elem = 10;

Я получаю следующую ошибку компиляции для вышеупомянутого:

error: the value of ‘stack_array<T, C, K>::max_elem’ is not usable in a constant expression
array<K, max_elem> store;
                ^
note: ‘stack_array<T, C, K>::max_elem’ was not initialized with a constant expression
static const size_t max_elem;

Я предполагаю, что эта ошибка возникает, поскольку статическая переменная const max_elem инициализируется после определения класса шаблона. Это понимание правильно? Есть ли способ устранить эту ошибку, не обязательно изменяя текущее использование max_elem?

1 Ответ

1 голос
/ 08 июля 2019

Я бы сказал, чтобы инициализировать статический элемент прямо на месте.

static const size_t max_elem = 10;

Подробнее здесь .

Постоянные статические элементы Если статические данныечлен целочисленного или перечислимого типа объявляется как const (и не энергозависимый), его можно инициализировать инициализатором, в котором каждое выражение является константным выражением, прямо внутри определения класса:

struct X {
     const static int n = 1;
     const static int m{2}; // since C++11
     const static int k; }; 

     const int X::k = 3; // Only this needs to be defined
...