Для этих целей вам необходим ещё один шаблонный параметр.
Можно сделать вот так:
template <const size_t c, const size_t b = c*c>
struct Sudoku_impl{
size_t s;
Sudoku_impl() {std::cout << b;}
};
int main(){
constexpr size_t x = 5;
Sudoku_impl<x> a;
return 0;
}
выглядит сомнительно из-за возможности переопределить второй шаблонный параметр, поэтому наружу такой судоку-класс отдавать не стоит. Чтобы решить эту проблему можно добавить псевдоним, ограничивающий количество шаблонных параметров до одного
например так:
template <const size_t c>
using Sudoku = Sudoku_impl<c, c*c>;
или просто напишите шаблон для конкретной функции
template <const size_t cell>
class Sudoku {
private:
class Slot;
arr2<Slot, size> board;
public:
template <size_t size = cell*cell>
arr<Slot, size>& operator[](size_t index);
}