Class template interaction
实际上,我相当确定可以在以前创建的线程中找到问题的答案。特别是,我必须在哪里和为什么要放"模板"和"类型名"关键字?这对模板/类型名消除歧义有很好的解释。但是,我很茫然,因为我实际上无法将这个概念扩展到我的代码中,我的代码是相互作用的类模板。
在这个线程中,我认为我看到的错误和我在代码中看到的相同。为什么用
尽管如此,我还是尝试了这些选择,但都无济于事。这是密码。谢谢你的帮助。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #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); } }; |
这看起来更像是一dependency循环问题比在template语法问题。只要你可以定义一个类与其他incomplete,你可以做一些像: P / < >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | // 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 |
如果在源文件includes只是testtemplatea.h,它会看到舱template定义为
你只需要
一个其他的东西:你的constructor
问题在这里 P / < >
1 | typedef testTemplateA<A> templateType; |
你是creating的template舱舱用template P / < >
1 2 | template<typename A> class testTemplateA |
而creating的template舱,你需要给的实际类型。所以它应该像这样, P / < >
1 | typedef testTemplateA<< testTemplateB<int >> templateType; |
它也adviced到用"级"如果它expected"将永远是一流的,与"typename"如果其他类型(int,char,*,无论浮)可能会expected。认为它的usage暗示。 P / < >