模板类成员函数之间的循环依赖关系

Cyclic dependency between template class member functions

本文关键字:循环 依赖 关系 之间 函数 成员      更新时间:2023-10-16

给定两个模板类,每个模板类都有引用其他类中成员函数的成员函数,如何做到这一点?如果有的话。通过使用正向声明来允许循环依赖关系,意味着该定义不可用于引用的成员函数。因此,出现了一个关于未定义类型的隐式实例化的错误。不能将成员函数的定义推送到cpp文件中,包括完整的类定义而不是前向声明,因为它必须存在于标头中,以便在使用/调用时允许编译器实例化。

template<typename T>
class A {
    void foo(B &b) { b.bar(); };
    void bar() {};
}
template<typename T>
class B {
    void foo(A &a) { a.bar(); };
    void bar() {};
}

现在我知道第一个响应将是"更改代码",但我正在尝试一些东西,这是我能看到的使其工作的唯一方法。因此,我很感兴趣的是,在C++中,以上是否可能。非常感谢!

在定义另一个模板之前先声明一个模板:

template <typename> class B;
template <typename T> class A {
    inline void foo(B<T> &b);
    inline void bar();
};
template <typename T> class B {
    void foo(A<T> &a) { a.bar(); }
    void bar() {}
};
template <typename T> void A<T>::foo(B<T> &b) { b.bar(); }
template <typename T> void A<T>::bar() {}