@Acaunt

Не удается сопоставить определение функции существующему объявлению. Как можно исправить?

У меня есть такая конструкция:
template <class T, const size_t size>
using arr = std::array<T, size>;

template <class T, const size_t size>
using arr2 = arr<arr<T, size>, size>;

template <const size_t cell>
class Sudoku {
public:
    constexp static const size_t size = cell * cell;
private:
    class Slot;
    arr2<Slot, size> board;
public:
    arr<Slot, cell * cell>& operator[](size_t index);
}

template<const uint cell>
inline arr<typename Sudoku<cell>::Slot, cell * cell>& Sudoku<cell>::operator[](uint index) {
    return board[index];
}


Всё прекрасно работает. Но я хотел бы вместо cell * cell написать в операторе size. Например так:

template <const size_t cell>
class Sudoku {
public:
    constexp static const size_t size = cell * cell;
private:
    class Slot;
    arr2<Slot, size> board;
public:
    arr<Slot, size>& operator[](size_t index);
}

template<const size_t cell>
inline arr<typename Sudoku<cell>::Slot, Sudoku<cell>::size>& Sudoku<cell>::operator[](size_t index) {
    return board[index];
}


Компилятор пишет:
Sudoku<cell>::operator[]: не удается сопоставить определение функции существующему объявлению


Есть ли способ иной способ так сделать?
  • Вопрос задан
  • 68 просмотров
Решения вопроса 1
@dima20155
you don't choose c++. It chooses you
Для этих целей вам необходим ещё один шаблонный параметр.
Можно сделать вот так:
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);
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы