c++ - 使用虚函数转发声明模板类的实例

标签 c++ templates forward-declaration

我创建了一个模板类 A<T>mynamespace我需要转发声明在类中使用 Bmynamespace2 .是否可以转发声明 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 将其拉入之前,您仍然必须在其他命名空间中转发声明模板。

关于c++ - 使用虚函数转发声明模板类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50078466/

相关文章:

c++ - 使用派生类实例作为默认参数值

c++ - 引用嵌套模板参数

c++ - 文件之间的前向声明

c++ - Windows用directx画东西不是更好吗?

c++ - 如果在同一翻译单元中调用函数,为什么需要重定位

c++ - 在 cpp 文件中设置静态枚举变量的正确方法

c++ - 在 GDB 中指定浮点精度

c++ - 有没有办法为函数模板特化命名类型?

c++ - 函数模板参数包的问题

c++ - 转发声明和删除