C ++模板方法前向声明

时间:2013-05-08 14:03:46

标签: c++ templates forward-declaration

我的班级有点问题。我有两个类都使用模板方法,因此我必须把它放在标题中。这是一个例子。我希望它能在没有“前向声明不完整”问题的情况下正确编译。我明白什么是错的,但我无法弄清楚如何纠正这个问题。谢谢你们。

class.h

    class A;
    class B;

    class A
    {
        B *foo;

        template <class T>
        void func()
        {
            foo->fanc();   
        }
    }

    class B
    {
       A *foo;

       void fanc();

       template <class T>
       void osef()
       {
            foo->func<int>();
       }
    }

1 个答案:

答案 0 :(得分:3)

你有循环依赖。您不能声明不完整类的对象。您可以通过声明指针或对不完整类的引用来解决此问题。

class A
{
    B* foo;

class A
{
    B& foo;

在后一种情况下,您必须使用构造函数的成员初始化列表初始化引用。


如果您正在使用指针,那么您应该在定义incomplte类之后移动memeber函数的定义。

class A;
class B;

class A
{
    B* foo;
    template <class T>
    void func();
};

class B
{
  // ...
};

template <class T>
inline void A::func()
^^^^^^                   // If you need to include the header in more than one source file.
{
    foo->fanc();   
}