【问题标题】:Header Lib Circular DependenciesHeader Lib 循环依赖
【发布时间】:2014-08-26 18:56:03
【问题描述】:

我一直在研究一个简单的仅标头库,但我遇到了一个我无法解决的循环问题。我按类型返回,这可能无济于事。

template<typename T>
class Foo;

class Bar;


class Baz
{
public:

   template<typename T>
   T getAFoo<T>()
   {
      return Foo<T>();
   }


   Bar getABar() // Prefer return by type in this situation.
   {
      return Bar(); // Error.
   }
};

template<typename T>
class Foo {
   /* ... */
   void doSomething() { m_baz.something(); }
   Baz &m_baz;
};

class Bar {
   /* ... */
   void doSomething() { m_baz.something(); }
   Baz &m_baz;
};

我尝试对函数 Bar getABar() 进行原型设计,然后在 Bars 定义之后对其进行定义,但这只会产生重复的符号错误。

有点觉得我只需要它是一个没有价值的模板。

【问题讨论】:

标签: c++ templates dependencies


【解决方案1】:

我也很抱歉。这个怎么样:

template<typename T>
class Foo;

class Bar;

class Baz
{
public:

    template<typename T>
    T getAFoo()
    {
        return Foo<T>();
    }

    void something(){}

    inline Bar getABar();
};

template<typename T>
class Foo {
    /* ... */
    void doSomething() { m_baz.something(); }
    Baz &m_baz;
};

class Bar {
public:
    Bar(Baz& baz)
        :m_baz(baz)
    {
    }
    /* ... */
    void doSomething() { m_baz.something(); }
    Baz &m_baz;
};

Bar Baz::getABar()
{
    return Bar(*this);
}

【讨论】:

  • 对不起,我应该提到 Foo 和 Bar 需要使用 Baz。所以需要的不仅仅是它们的大小。我已经更新以在问题中反映这一点。
  • @PhilCK,我已经修改了。
猜你喜欢
  • 2010-09-12
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
相关资源
最近更新 更多