考虑以下循环依赖的示例。
Foo 类提供了一些静态功能:
//Foo.h
#pragma once
#include "T1.h" //causes circular dependency
class Foo
{
public:
static void doSomething();
private:
static T1<int> t1;
};
//Foo.cpp
#include "Foo.h"
void Foo::doSomething(){
}
模板类 T1 的方法调用Foo :: doSomething()。
//T1.h
#pragma once
template<class T>
class T1
{
public:
void doSomething(T t);
};
#include "T1.tcc"
//T1.tcc
#pragma once
#include "T1.h"
#include "Foo.h" //causes circular dependency
template<class T>
void T1<T>::doSomething(T t){
Foo::doSomething();
}
Foo.h必须包含T1.h,因为Foo包含T1的对象。 T1.tcc必须包含Foo.h,因为它调用Foo的静态成员函数。因为Foo.h已经被包含保护所保护,所以此时不会声明Foo(我猜)。
../ T1.tcc:9:5:错误:'Foo'尚未声明
从设计的角度来看,这不应该是完全合法的,因为T1不包含Foo的对象吗?
我可能存储一个指向T1的指针,而不是按值保存对象,但是如果我不想在堆上存储t1,还有其他方法可以避免这个问题吗?
答案 0 :(得分:4)
static
类数据成员,因此从Foo.h
只需替换:
#include "T1.h"
... with:
template<class T>
class T1;