gpt4 book ai didi

c++ - 解决模板类之间的循环依赖

转载 作者:IT老高 更新时间:2023-10-28 21:49:15 29 4
gpt4 key购买 nike

我有两个类,Foo<T>Bar<T> , 源自 Base .每个都覆盖一个方法 virtual Base* convert(ID) const , 其中 ID是唯一标识 Foo 的特定实例的类型的实例或 Bar (假设它是 enum )。问题是 Foo::convert()需要能够返回 Bar实例,同样Bar::convert()需要能够实例化Foo .由于它们都是模板,这会导致 Foo.h 之间的循环依赖。和 Bar.h .我该如何解决这个问题?

编辑:前向声明不起作用,因为每个方法的实现都需要另一个类的构造函数:

Foo.h :

#include <Base.h>

template<class T> class Bar;

template<class T>
class Foo : public Base { ... };

template<class T>
Base* Foo<T>::convert(ID id) const {

if (id == BAR_INT)
return new Bar<int>(value); // Error.

...

}

Bar.h :

#include <Base.h>

template<class T> class Foo;

template<class T>
class Bar : public Base { ... };

template<class T>
Base* Bar<T>::convert(ID id) const {

if (id == FOO_FLOAT)
return new Foo<float>(value); // Error.

...

}

错误自然是“不完整类型的无效使用”。

最佳答案

您需要做的是将类声明与实现分开。所以像

template <class T> class Foo : public Base
{
public:
Base* convert(ID) const;
}

template <class T> class Bar : public Base
{
public:
Base* convert(ID) const;
}

template <class T> Base* Foo<T>::convert(ID) const {return new Bar<T>;}
template <class T> Base* Bar<T>::convert(ID) const {return new Foo<T>;}

这样,在定义函数时,您就有了完整的类定义。

关于c++ - 解决模板类之间的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3353831/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com