我实际上相当确定我的问题的答案可以在之前创建的一个线程中找到 . 特别是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);
}
};
2 回答
这看起来更像是循环依赖问题,而不是模板语法问题 . 只要您可以定义一个类与另一个类不完整,您可以执行以下操作:
如果源文件只包含testTemplateA.h,它将看到
testTemplateA
的类模板定义,然后包含testTemplateB.h的全部内容,然后查看testTemplateA.h中依赖于testTemplateB
的成员定义 . 如果源文件只包含testTemplateB.h,它将立即以testTemplateA.h开头,它将在中间包含testTemplateB.h并获得相同的结果 . 如果源文件以任一顺序包含两者,则第二个文件将不起作用,因为两者都已包括在内 .您只需要在包含至少一个
::
令牌的名称前面使用typename
关键字 .另一件事:您的构造函数
testTemplateB(templateType& TA);
需要引用,但您的语句testTemplateB<A> g = testTemplateB<A>(this);
传递指针值this
.问题在这里
您正在使用类模板创建模板类
在创建模板类时,您需要提供实际类型 . 所以它应该是这样的,
如果可能需要其他类型(int,char *,float),建议使用“ class " if it is expected T will always be a class, with " typename ” . 考虑一下使用提示 .