Два файла включают друг друга в проблему C ++ - PullRequest
0 голосов
/ 15 августа 2011

Я делаю некоторый вклад в библиотеку с открытым исходным кодом, но у меня возникают проблемы при модификации кода других людей.Ранее в библиотеке был файл с именем IntervalT.h и файл с именем Curves.h с реализацией в файле Curves.tcc, а Interval.h по некоторым причинам включает в себя Curves.h.Сейчас мне нужно использовать IntervalT.h в Curves.h, но когда я пытался использовать класс IntervalT<NT>, определенный в IntervalT.h, компилятор выдает ошибку (я уже включил IntervalT.h в начале Curves.h file):

../../../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 в конце концов?

1 Ответ

2 голосов
/ 15 августа 2011

Я могу только догадываться (потому что вы можете называть свои файлы как угодно), но расширение .tcc является модификацией расширения .cc (которое является просто кодом C ++), но t означает template. Это подтверждается тем фактом, что Curves.h включает в себя Curves.tcc, что является распространенным методом отделения интерфейса от реализации шаблона, при этом не нарушая компилятор, который ожидает объявления и определения шаблонного кода в одном и том же файле (или вы получаете ошибку). См. Этот ответ, чтобы получить лучшую идею .

does not name a type может означать, что IntervalT является шаблоном, а вы не предоставляете параметр шаблона (или это может быть другая ошибка, я не пробовал), или что даже если файл называется IntervalT.h он не содержит класс с именем IntervalT или что он находится в другом пространстве имен. Вам нужно будет дать больше информации, прежде чем мы сможем поставить более точный диагноз.

...