首页 > 解决方案 > C++ 运行时模板常量

问题描述

我试图在using类中创建一个用户定义的容器类型和私有成员,它们不是编译时常量。无效并被编译器抱怨。这些私有成员常量只会在运行时初始化。这种情况有这样的补救措施吗?

#include <vector>
#include <array>
#include <string>
#include <iostream>


class SudokuBoard
{
private:
    Board _board_data;
    int _BOX_SIZE;
    int _BOARD_SIZE;
    const int _MAX_VALUE = _BOARD_SIZE;
    const int _NUM_CONSTRAINTS = 4;
    
public:
    template <class T, int ROW, int COL>
    using Matrix = std::array<std::array<T, COL>, ROW>;
    using CoverMatrix = Matrix<int, _BOARD_SIZE * _BOARD_SIZE * _MAX_VALUE, _BOARD_SIZE * _BOARD_SIZE * _NUM_CONSTRAINTS>;
    using Board = Matrix<int, _BOARD_SIZE, _BOARD_SIZE>;

    SudokuBoard(const std::string& filename);

    void set_board_data(int row, int col, int num) { _board_data[row][col] = num; }
    int get_board_data(int row, int col) const { return _board_data[row][col]; }
    Board get_board_data() const { return _board_data; }
    int at(int row, int col) const { return _board_data[row][col]; }
    
    // Prints the Sudoku board
    friend void print_board(const SudokuBoard& board);
    friend std::ostream& operator<< (std::ostream &out, const SudokuBoard& board);

    int indexInCoverMatrix(int row, int col, int num);
    int createBoxConstraints(CoverMatrix coverMatrix, int header);
    int createColumnConstraints(CoverMatrix coverMatrix, int header);
    int createRowConstraints(CoverMatrix coverMatrix, int header);
    int createCellConstraints(CoverMatrix coverMatrix, int header);
    void createCoverMatrix(CoverMatrix coverMatrix);
    void convertToCoverMatrix(Board board, CoverMatrix coverMatrix);
};

标签: c++templates

解决方案


你得到的第一个问题,用占位符编译这个问题class Board{};是这样的:

编译失败有关更多信息,请参阅输出窗口 x86-64 clang 12.0.1 - 405ms

:23:37: 错误:使用 CoverMatrix = Matrix 对非静态数据成员 '_BOARD_SIZE' 的使用无效;

这告诉你的是编译器在编译它们时需要知道你的模板的大小和类型。

第一步是使它们成为静态常量。这样,编译器在编译时就知道:

static const int _BOARD_SIZE = 9;
static const int _MAX_VALUE = _BOARD_SIZE;

(constexpr 为您提供其他更现代的选项,但这是一个起点)

然后,您可能希望您的 SudokuBoard 类本身以某种类型为模板T。但我无法到达那里,因为你没有提供Board课程。


推荐阅读