【问题标题】:C++ Typedef inside classes using private members使用私有成员的类内部的 C++ Typedef
【发布时间】:2021-08-06 12:23:30
【问题描述】:

我尝试通过使用私有成员来自定义类中的某些类型,这些成员用于设置自定义容器的大小。但我收到了:

error: ‘CoverMatrix’ does not name a type
error: ‘Board’ does not name a type

如何正确操作它?

#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>;
    typedef CoverMatrix Matrix<int, _BOARD_SIZE * _BOARD_SIZE * _MAX_VALUE, _BOARD_SIZE * _BOARD_SIZE * _NUM_CONSTRAINTS>;
    typedef 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);
};

【问题讨论】:

  • 请注意,int _BOX_SIZE;int _BOARD_SIZE;const int _MAX_VALUE = _BOARD_SIZE;const int _NUM_CONSTRAINTS = 4; 都不能用于模板参数,因为它们不是编译时常量。
  • 请检查正确的typedef syntax
  • 您没有说明您正在使用的 C++ 版本,但您可能对 using 关键字感兴趣。 en.cppreference.com/w/cpp/language/type_alias
  • 您已经将using 用于Matrix,为什么不将其扩展为CoverMatrix/Board

标签: c++ class oop typedef


【解决方案1】:

您已经正确使用using 来设置Matrix 类型。你真的应该对其他类型继续这样做:

using CoverMatrix = Matrix<int, _BOARD_SIZE* _BOARD_SIZE* _MAX_VALUE, _BOARD_SIZE* _BOARD_SIZE* _NUM_CONSTRAINTS>;
using Board       = Matrix<int, _BOARD_SIZE, _BOARD_SIZE>;

但如果你出于某种原因坚持混合使用usingtypedef,那么正确的语法是:

typedef Matrix<int, _BOARD_SIZE* _BOARD_SIZE* _MAX_VALUE, _BOARD_SIZE* _BOARD_SIZE* _NUM_CONSTRAINTS> CoverMatrix;
typedef Matrix<int, _BOARD_SIZE, _BOARD_SIZE> Board;

换句话说:

using identifier = type;
typedef type identifier;

另外,请注意,正如@NathanOliver 指出的那样,您的私有int 成员不是编译时常量。因此,在您修复 typedef 语法后,代码仍然无法工作 - 但如果您需要帮助,可以将其放在一个新问题中。 StackOverflow 每个问题只喜欢一个主题。

【讨论】:

    猜你喜欢
    • 2017-12-22
    • 1970-01-01
    • 2014-06-03
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多