首页 文章

类模板交互

提问于
浏览
0

我实际上相当确定我的问题的答案可以在之前创建的一个线程中找到 . 特别是Where and why do I have to put the "template" and "typename" keywords?,它对模板/ typename消歧有很好的解释 . 然而,我不知所措,因为我实际上无法将概念扩展到我的代码,这些代码是彼此交互的类模板 .

在这个帖子中,我认为我看到了与我的代码相同的错误 . 为什么使用 A<B> 来定义typedef的答案,其中B是类,而不是 A<T> ,其中T是我们实际想要的类型名称模板 .

不过,我尝试过这些选项无济于事 . 这是代码 . 谢谢您的帮助 .

#include "testTemplateA.h"
template<typename A>
class testTemplateB {
public:
    // none of these work
    typedef testTemplateA<A> templateType;
    typedef typename testTemplateA<A> templateType;
    typedef typename testTemplateA<testTemplateB> templateType;

    testTemplateB(templateType& TA) {}

    ~testTemplateB(void) {}
};

#include "testTemplateB.h"
template<typename A>
class testTemplateA
{
public:
    testTemplateA(void) {}

    ~testTemplateA(void) {}

    void callUponB(void) {
        testTemplateB<A> g = testTemplateB<A>(this);
    }



};

2 回答

  • 0

    这看起来更像是循环依赖问题,而不是模板语法问题 . 只要您可以定义一个类与另一个类不完整,您可以执行以下操作:

    // Begin testTemplateA.h
    #ifndef TEST_TEMPLATE_A_H
    #define TEST_TEMPLATE_A_H
    
    template<typename A>
    class testTemplateA
    {
    public:
        testTemplateA(void) {}
    
        ~testTemplateA(void) {}
    
        void callUponB(void); // Can't be defined here!
    };
    
    #include "testTemplateB.h"
    
    template<typename A>
    void testTemplateA<A>::callUponB(void) {
        testTemplateB<A> g = testTemplateB<A>(this);
    }
    
    #endif
    // End testTemplateA.h
    
    // Begin testTemplateB.h
    // Yes, the include is outside the define guard.
    #include "testTemplateA.h"
    
    #ifndef TEST_TEMPLATE_B_H
    #define TEST_TEMPLATE_B_H
    
    template<typename A>
    class testTemplateB {
    public:
        typedef testTemplateA<A> templateType;
    
        testTemplateB(templateType& TA) {}
    
        ~testTemplateB(void) {}
    };
    
    #endif
    // End testTemplateB.h
    

    如果源文件只包含testTemplateA.h,它将看到 testTemplateA 的类模板定义,然后包含testTemplateB.h的全部内容,然后查看testTemplateA.h中依赖于 testTemplateB 的成员定义 . 如果源文件只包含testTemplateB.h,它将立即以testTemplateA.h开头,它将在中间包含testTemplateB.h并获得相同的结果 . 如果源文件以任一顺序包含两者,则第二个文件将不起作用,因为两者都已包括在内 .

    您只需要在包含至少一个 :: 令牌的名称前面使用 typename 关键字 .

    另一件事:您的构造函数 testTemplateB(templateType& TA); 需要引用,但您的语句 testTemplateB<A> g = testTemplateB<A>(this); 传递指针值 this .

  • 0

    问题在这里

    typedef testTemplateA<A> templateType;
    

    您正在使用类模板创建模板类

    template<typename A>
    class testTemplateA
    

    在创建模板类时,您需要提供实际类型 . 所以它应该是这样的,

    typedef testTemplateA<< testTemplateB<int >> templateType;
    

    如果可能需要其他类型(int,char *,float),建议使用“ class " if it is expected T will always be a class, with " typename ” . 考虑一下使用提示 .

相关问题