考虑一个仅头文件库实现,如下所示,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 _-&gt; mar(),编译器会给出错误:
error C2027: use of undefined type 'bar'
see declaration of 'bar'
error C2039: 'mar': is not a member of 'std::shared_ptr<bar>'
考虑到库只是标题的约束,是可解决的问题吗?
答案 0 :(得分:3)
出现问题的原因是您在类定义之前尝试调用类“bar”的方法“marr()”。当你调用“bar _-&gt; mar();”时,你只声明了类“bar”。编译器知道有一个类“bar”但不知道它有什么方法。 解决方案是在定义“bar”之后调用“foo”的构造函数。如果您的库只是标题,则可以将其声明为“内联”。
此代码编译好:
#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();
}