我实际上相当确定我的问题的答案可以在之前创建的一个线程中找到。特别是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);
}
};
答案 0 :(得分:0)
问题在这里
typedef testTemplateA<A> templateType;
您正在使用类模板
创建模板类template<typename A>
class testTemplateA
创建模板类时,您需要提供实际类型。所以它应该是这样的,
typedef testTemplateA<< testTemplateB<int >> templateType;
建议使用“类”如果预期T将永远是一个类,如果是其他类型,则使用“ typename ”(int,char *,float无论如何)可能是预期的。考虑一下使用提示。
答案 1 :(得分: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中依赖于{的成员定义{1}}。如果源文件只包含testTemplateB.h,它将立即以testTemplateA.h开头,它将在中间包含testTemplateB.h并获得相同的结果。如果源文件以任一顺序包含两者,则第二个文件将不起作用,因为两者都已包含在内。
您只需要在包含至少一个testTemplateB
令牌的名称前面添加typename
关键字。
另一件事:您的构造函数::
需要引用,但您的语句testTemplateB(templateType& TA);
会传递指针值testTemplateB<A> g = testTemplateB<A>(this);
。