c++ - 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);
};
解决方案
你得到的第一个问题,用占位符编译这个问题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
课程。
推荐阅读
- python - 如何使用 pandas 读取 .txt 数据列并提供给 TF
- spring - 使用 JAXB 编组 XML 元素内的属性
- javascript - 循环结果数组的最后一个索引
- java - EnumSet.spliterator 没有特征 Spliterator.NONNULL
- html - Div 图像背景在打印时被子表隐藏
- c++ - 使用结构作为缓冲架
- java - 通用连接池 java JDBC Oracle 12c 的应用程序连续性
- sql-server - MSSQL 服务器 (v. 16) 可以将返回的 json 格式的 sql-query 保存到另一个 db-table 中吗
- sql - 连接两个具有不同从到间隔的表以更新列
- java - React Native 应用程序不会在 USB 或 APK 形式上为 Android 构建,但在模拟器中构建良好