我正在为一个开源库做一些贡献,但在修改其他人的代码时遇到了困难。以前,该库有一个名为IntervalT.h
的文件和一个称为Curves.h
的文件,实现在文件Curves.tcc
中,由于某种原因,Interval.h
包括Curves.h
。现在我需要在Curves.h
中使用IntervalT.h
,但当我尝试使用IntervalT.h
中定义的类IntervalT<NT>
时,编译器给了我错误(我已经在Curves.h
文件的开头包含了IntervalT.h
(:
../../../inc/CORE/poly/Curves.h:1337:3: error: ‘IntervalT’ does not name a type
我的问题是:由于我以前从未有过这样的经历,"does not name a type
"错误是否与c++头文件的相互包含有关?或者是其他错误导致了这个错误?如果是这样的话,我应该如何编写程序,让Curve.h看到IntervalT.h?
顺便说一下,这段代码的组织方式非常奇怪。Curves.tcc
实际上包含在Curves.h
中,这与我们通常的做法相反。这样做有什么特殊的原因吗?或者这其实并不重要?什么是.tcc
扩展?
我只能猜测(因为你可以随心所欲地命名你的文件(,但.tcc
扩展名是对.cc
扩展名的修改(它只是C++代码(,而t
代表template
。Curves.h
包含Curves.tcc
这一事实证实了这一点,CCD_21是一种将接口与模板实现分离的常见技术,同时仍然不会干扰编译器,因为编译器希望在同一文件中声明和定义模板化代码(否则会出现错误(。查看此答案以获得更好的想法。
does not name a type
可能是IntervalT
是一个模板,而您没有提供模板参数(或者这可能是另一个错误,我没有尝试过(,或者即使文件名为IntervalT.h
,它也不包含名为CCD25的类,或者它在不同的命名空间中。在我们做出更好的诊断之前,你必须提供更多信息。