C++ 使用constexpr构造函数转发结构声明
我想将结构类的全局实例添加到具有特殊意义的程序中。有效的MWE是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
// 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&&y std::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