关于C++:类模板交互

Class template interaction

实际上,我相当确定可以在以前创建的线程中找到问题的答案。特别是,我必须在哪里和为什么要放"模板"和"类型名"关键字?这对模板/类型名消除歧义有很好的解释。但是,我很茫然,因为我实际上无法将这个概念扩展到我的代码中,我的代码是相互作用的类模板。

在这个线程中,我认为我看到的错误和我在代码中看到的相同。为什么用A定义typedef的答案是,其中b是类,而不是A,其中t是我们实际想要的类型名模板。

尽管如此,我还是尝试了这些选择,但都无济于事。这是密码。谢谢你的帮助。

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定义为testTemplateA,然后包括的整个内容的testtemplateb.h,然后看到了成员国的definitions在testtemplatea.h,依靠testTemplateB。如果在源文件includes只是testtemplateb.h,它将立即开始与testtemplatea.h,还将包括testtemplateb.h在中间得到同样的结果。如果在源文件includes都在任何秩序,第二个就没有发挥作用,因为已经有了两种都包括。 P / < >

你只需要typenamekeyword喜欢在前面的名字包括至少有一个::令牌。 P / < >

一个其他的东西:你的constructor testTemplateB(templateType& TA);expects的参考,但是你的testTemplateB g = testTemplateB(this);statement passes的this指针的值。 P / < >


问题在这里 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 / < >