C++ 使用constexpr构造函数转发结构声明

C++ 使用constexpr构造函数转发结构声明,c++,struct,constructor,forward-declaration,C++,Struct,Constructor,Forward Declaration,我想将结构类的全局实例添加到具有特殊意义的程序中。有效的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

我想将结构类的全局实例添加到具有特殊意义的程序中。有效的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;
}
问题是,由于我无法真正理解的错误,该文件无法编译:

错误:变量“constexpr const Position empty”具有初始值设定项,但类型不完整
错误:无效使用不完整的类型“struct Position”


这个问题可以解决吗?

您可以在创建
后,在方法,然后定义它:

 // 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;
}
//示例程序
#包括
结构位置;
constexpr int x_max=3;
constexpr int y_max=4;
类型定义结构位置{
constexpr位置(intx,inty):x(x),y(y){};
int x;
int-y;
内联布尔运算符!=(常量位置和rhs)常量{
返回(x!=rhs.x | | y!=rhs.y);
}
bool in_grid()常量;
}位置;
constexpr Position empty=位置(1,1);
内联布尔位置::内部网格()常量{
返回(x>=0&&x=0&&ystd::cout您可以在创建
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;
}
//示例程序
#包括
结构位置;
constexpr int x_max=3;
constexpr int y_max=4;
类型定义结构位置{
constexpr位置(intx,inty):x(x),y(y){};
int x;
int-y;
内联布尔运算符!=(常量位置和rhs)常量{
返回(x!=rhs.x | | y!=rhs.y);
}
bool in_grid()常量;
}位置;
constexpr Position empty=位置(1,1);
内联布尔位置::内部网格()常量{
返回(x>=0&&x=0&&y