使用虚函数转发声明模板 Class 的实例

Forward Declare instance of Template Class with Virtual Functions

我在 mynamespace 中创建了一个模板 class A<T>,我需要转发声明以在 class B 中使用 mynamespace2 ].是否可以转发声明 A 的特定实例以用于 B,即 A<int>

文件:a.h

#include "b.h"

namespace mynamespace{    
    template <class T>
    class A{
        A(T);                                // constructor
        mynamespace2::B* b_attribute;
    };    
}

文件:b.h

/* How to forward declare A<int>? This doesn't work:
 *
 *  namespace mynamespace{
 *     class A<int>;
 *  }
 * 
 * neither does this:
 *
 * namespace mynamespace{
 *     template <class T>
 *     class A<T>
 * }
 */

namespace mynamespace2{    
    class B{
        B();
        mynamespace::A<int>* a_attribute;    // for use over here
        virtual void f(A<int>*);             // note: virtual function
    };    
}

感谢任何帮助。

这与前向声明任何其他内容没有什么不同,只是您必须正确获取命名空间:

namespace mynamespace{    
    template <class T> class A;
}

A 是在 mynamespace 中声明的,所以你必须这样指定它。

如果你真的想避免每次都显式指定命名空间,添加一个using声明:

namespace mynamespace2{
    using mynamespace::A;

    class B{
        B();
        A<int>* a_attribute;    // for use over here
    };    
}

一旦做出 using 声明,您就可以在 mynamespace2.

中的任何地方引用 A

请注意,在使用 using.

将其拉入之前,您仍然必须在其他命名空间中转发声明模板。