使用虚函数转发模板类的实例

时间:2018-04-28 16:05:55

标签: c++ templates forward-declaration

我在A<T>中创建了一个模板类mynamespace,我需要转发声明在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
    };    
}

我感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

这与向前声明其他任何内容没有什么不同,除了你必须正确命名空间:

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

Amynamespace中声明,因此您必须指定它。

如果您确实希望每次都避免显式指定命名空间,请添加using声明:

namespace mynamespace2{
    using mynamespace::A;

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

发出using声明之后,您可以在A内的任何地方引用mynamespace2

请注意,在使用using提取模板之前,您仍必须在其他命名空间中向前声明模板。