使用 constexpr 构造函数对结构进行前向声明

Forward declaration of struct with constexpr constructor

本文关键字:声明 结构 constexpr 构造函数 使用      更新时间:2023-10-16

我想将结构类的全局实例添加到我的程序中,该服务器具有特殊含义。有效的 MWE 是

// Example program
#include <iostream>
constexpr int x_max = 3;
constexpr int y_max = 4;
typedef struct Position {
    constexpr Position(int x, int y) : x(x), y(y) {};
    int x;
    int y;
    inline bool operator!=(const Position &rhs) const {
        return (x != rhs.x || y != rhs.y);
    }
    inline bool inside_grid(const Position &empty) const {
        return (x >= 0 && x < x_max && y >= 0 && y < y_max && *this != empty);
    }
} Position;
constexpr Position empty = Position(1,1);

int main()
{
  Position p1 = Position(2,3);
  Position p2 = Position(1,1);
  std::cout << "p1.inside_grid(empty) = " <<  p1.inside_grid(empty) << " and  p2.inside_grid(empty) = " << p2.inside_grid(empty) << std::endl;
}

全局常量empty必须传递给方法 inside_grid 的每个调用,这让我想到是否可以在程序开始时声明全局并修改 inside_grid 方法以不采用任何参数如下:

 // Example program
#include <iostream>
struct Position;
constexpr Position empty = Point(1, 1);
constexpr int x_max = 3;
constexpr int y_max = 4;
typedef struct Position {
    constexpr Position(int x, int y) : x(x), y(y) {};
    int x;
    int y;
    inline bool operator!=(const Position &rhs) const {
        return (x != rhs.x || y != rhs.y);
    }
    inline bool inside_grid() const {
        return (x >= 0 && x < x_max && y >= 0 && y < y_max && *this != empty);
    }
} Position;

int main()
{
  Position p1 = Position(2,3);
  Position p2 = Position(1,1);
  std::cout << "p1.inside_grid() = " <<  p1.inside_grid() << " and  p2.inside_grid() = " << p2.inside_grid() << std::endl;
}

问题是由于我无法真正理解的错误,这不会编译: error: variable 'constexpr const Position empty' has initializer but incomplete type error: invalid use of incomplete type 'struct Position'

这个问题能解决吗?

您可以转发声明 inside_grid() 方法,并在创建 empty 后稍后定义它:

 // Example program
#include <iostream>
struct Position;
constexpr int x_max = 3;
constexpr int y_max = 4;
typedef struct Position {
    constexpr Position(int x, int y) : x(x), y(y) {};
    int x;
    int y;
    inline bool operator!=(const Position &rhs) const {
        return (x != rhs.x || y != rhs.y);
    }
    bool inside_grid() const;
} Position;
constexpr Position empty = Position(1, 1);
inline bool Position::inside_grid() const {
    return (x >= 0 && x < x_max && y >= 0 && y < y_max && *this != empty);
}

int main()
{
  Position p1 = Position(2,3);
  Position p2 = Position(1,1);
  std::cout << "p1.inside_grid() = " <<  p1.inside_grid() << " and  p2.inside_grid() = " << p2.inside_grid() << std::endl;
}