0

我实际上相当确定我的问题的答案可以在先前创建的线程之一中找到。特别是,我必须在哪里以及为什么要放置“模板”和“类型名称”关键字?这对模板/类型名消歧有很好的解释。然而,我不知所措,因为我实际上无法将这个概念扩展到我的代码,这些代码是相互交互的类模板。

在这个线程中,我认为我看到了与我的代码中相同的错误。A<B>为什么使用where B 是类来定义 typedef 的答案,而不是A<T>where 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);
    }



};
4

2 回答 2

0

问题就在这里

typedef testTemplateA<A> templateType;

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

template<typename A>
class testTemplateA

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

typedef testTemplateA<< testTemplateB<int >> templateType;

如果预期 T 将始终是一个类,则建议使用“ class ”,如果可能预期其他类型(int、char*、float 等)则使用“ typename ”。将其视为使用提示。

于 2014-03-22T05:03:53.693 回答
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);传递了指针 value this

于 2014-03-22T05:08:34.943 回答