考虑只有头的库实现,如下所示,foo和bar具有循环依赖关系。
class bar;
class foo {
public:
foo(std::shared_ptr<bar> bar_){
//bar_->mar()
}
void moo() {};
};
class bar {
bar(std::shared_ptr<foo> foo_) {
foo_->moo();
}
void mar() { };
};在将此头包含在(client.cpp)文件中并注释掉//bar_->mar()时,编译器会给出错误:
error C2027: use of undefined type 'bar'
see declaration of 'bar'
error C2039: 'mar': is not a member of 'std::shared_ptr<bar>'如果库仅为标头,该问题是否可以解决?
发布于 2016-04-08 11:33:41
出现此问题是因为您试图在类定义之前调用类"bar“的方法"marr()”。只有在调用“bar_->mar()”时才声明类"bar“;”编译器知道有类“"bar”,但不知道它有哪些方法。解决方案是在定义"bar“之后调用"foo”的构造函数。如果您的库仅为标头,则可以将其声明为“内联”。
此代码编译ok:
#pragma once
#include <memory>
class bar;
class foo {
public:
foo(std::shared_ptr<bar> bar_);
void moo() {};
};
class bar {
public:
bar(std::shared_ptr<foo> foo_) {
foo_->moo();
}
void mar() { };
};
inline foo::foo(std::shared_ptr<bar> bar_){
bar_->mar();
}https://stackoverflow.com/questions/36496943
复制相似问题