【问题标题】:Forward declaration of struct with constexpr constructor使用 constexpr 构造函数前向声明结构
【发布时间】:2017-03-26 09:31:53
【问题描述】:

我想将一个结构类的全局实例添加到我的程序中,即服务器具有特殊意义。一个有效的 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'

这个问题能解决吗?

【问题讨论】:

    标签: c++ struct constructor forward-declaration


    【解决方案1】:

    您可以转发声明您的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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      • 2021-10-19
      • 2011-01-10
      相关资源
      最近更新 更多