代码之家  ›  专栏  ›  技术社区  ›  user3417339

类模板交互

  •  0
  • user3417339  · 技术社区  · 10 年前

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

    在这个线程中,我想我看到的错误与代码中的错误相同。为什么要使用 A<B> 其中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 回复  |  直到 7 年前
        1
  •  0
  •   aschepler    10 年前

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

    // 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,则它将立即以testTemplatA.h开头,该文件中间仍包含testTemplateB.h并获得相同的结果。如果源文件以任一顺序包含这两个文件,则第二个文件将无效,因为两者都已包含。

    你只需要 typename 在至少包含一个 :: 代币

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

        2
  •  0
  •   Dipika    10 年前

    问题就在这里

    typedef testTemplateA<A> templateType;
    

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

    template<typename A>
    class testTemplateA
    

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

    typedef testTemplateA<< testTemplateB<int >> templateType;
    

    建议使用“ “如果预期T将始终是一个类,具有” 类别名 如果可能需要其他类型(int、char*、float whatever),请将其视为用法提示。

    推荐文章