导致循环依赖的类模板

时间:2017-01-12 12:11:22

标签: c++ templates

考虑以下循环依赖的示例。

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,还有其他方法可以避免这个问题吗?

1 个答案:

答案 0 :(得分:4)

可以在没有类型定义的情况下声明

static类数据成员,因此从Foo.h只需替换:

#include "T1.h"

... with:

template<class T>
class T1;