前向声明中的字段类型不完整
Field has incomplete type in forward declaration
我用下面的简单文件重现了一个错误。
它说:
字段类型不完整'Foo'
bar.h:
class Foo;
class Bar{
private:
int x_;
Foo foo_; // error: incomplete type
public:
void setx(int x) {x_ = x;};
void increment(int);
};
class Foo{
public:
void run(int y,Bar& bar) {bar.setx(y);};
};
void Bar::increment(int i){foo_.run(i,*this);}
成员 foo_ 不能是引用或指针。这样做的原因是在我的实际代码中,我无法在Bar的初始化列表中初始化Foo。
你的问题可以简化为:
class Foo;
class Bar{
Foo foo_; // error: incomplete type
};
这里你对类型 Foo
进行了前向声明,即没有完整定义的声明:这在 C++ 中足以声明一个指针,但不像你在 Bar
中那样声明一个具体实例.
要么给你一个完整的定义 class:
class Foo{
// put details here
};
class Bar{
Foo foo_; // OK
};
或使用(智能)指针,例如:
class Foo;
class Bar{
std::unique_ptr<Foo> foo_; // OK
};
或更改 所指出的订单声明。
在这种情况下很简单:因为 Foo
只使用对 Bar
的引用,翻转它们就可以了:
class Bar;
class Foo{
public:
void run(int y,Bar& bar);
};
class Bar { ... };
void Foo::run(int y, Bar& bar) {
bar.setx(y);
}
您还需要将Foo::run
的主体移动到下面,因为它实际上使用了Bar
成员函数。
我用下面的简单文件重现了一个错误。
它说:
字段类型不完整'Foo'
bar.h:
class Foo;
class Bar{
private:
int x_;
Foo foo_; // error: incomplete type
public:
void setx(int x) {x_ = x;};
void increment(int);
};
class Foo{
public:
void run(int y,Bar& bar) {bar.setx(y);};
};
void Bar::increment(int i){foo_.run(i,*this);}
成员 foo_ 不能是引用或指针。这样做的原因是在我的实际代码中,我无法在Bar的初始化列表中初始化Foo。
你的问题可以简化为:
class Foo;
class Bar{
Foo foo_; // error: incomplete type
};
这里你对类型 Foo
进行了前向声明,即没有完整定义的声明:这在 C++ 中足以声明一个指针,但不像你在 Bar
中那样声明一个具体实例.
要么给你一个完整的定义 class:
class Foo{
// put details here
};
class Bar{
Foo foo_; // OK
};
或使用(智能)指针,例如:
class Foo;
class Bar{
std::unique_ptr<Foo> foo_; // OK
};
或更改
在这种情况下很简单:因为 Foo
只使用对 Bar
的引用,翻转它们就可以了:
class Bar;
class Foo{
public:
void run(int y,Bar& bar);
};
class Bar { ... };
void Foo::run(int y, Bar& bar) {
bar.setx(y);
}
您还需要将Foo::run
的主体移动到下面,因为它实际上使用了Bar
成员函数。