我正在为开源库做一些贡献,但我在修改其他人的代码时遇到了麻烦。以前,该库有一个名为IntervalT.h
的文件和一个名为Curves.h
的文件,其实现位于文件Curves.tcc
中,而Interval.h
由于某种原因包含Curves.h
。现在我需要在IntervalT.h
中使用Curves.h
,但是当我尝试使用IntervalT<NT>
中定义的类IntervalT.h
时,编译器会给我错误(我已经包含了IntervalT.h
文件开头的Curves.h
:
../../../inc/CORE/poly/Curves.h:1337:3: error: ‘IntervalT’ does not name a type
我的问题是:既然我之前从未有过这样的经历,那么“does not name a type
”错误是否与c ++头文件的相互包含有关?或者是导致此错误的其他错误?如果是这样,我应该如何编写程序让Curves.h看到IntervalT.h?
顺便说一句,这段代码是以非常奇怪的方式组织的。 Curves.tcc
实际上包含Curves.h
,这是我们通常采用的相反方式。有没有特别的理由这样做?或者它真的没关系?什么是.tcc
扩展呢?
答案 0 :(得分:2)
我只能猜测(因为你可以根据需要命名你的文件),但.tcc
扩展名是.cc
扩展名(只是C ++代码)的修改,但是{{1代表t
。这是由template
包含Curves.h
这一事实所证实的,Curves.tcc
是一种将接口与模板实现分离的常用技术,同时仍然不会扰乱编译器,该编译器需要在模板中声明和定义模板化代码。同一个文件(或者你得到一个错误)。 See this answer to get a better idea
does not name a type
可能是IntervalT
是模板而你没有提供模板参数(或者可能是一个不同的错误,我还没试过),或者即使该文件名为IntervalT.h
,它不包含名为IntervalT
的类,或者它位于不同的名称空间中。在我们做出更好的诊断之前,您必须提供更多信息。