Неизвестное имя типа при объявлении в заголовке

0

По какой-то нечетной причине я получаю неизвестное имя типа для переменной typedef void, расположенной в файле заголовка. Естественно, я искал в сети, и хотя можно заметить, что я нашел похожие проблемы, также следует отметить, что я не использую IDE только Vim и Clang и не имею предварительно скомпилированных заголовков. В отдельном тесте для заголовка ctrie_int все компилируется, но когда я расширяю реализацию, добавляя свой заголовок к файлу реализации другого заголовка, я получаю странную ошибку, показанную ниже. Я уверен, что это простая проблема, но я не уверен, что это такое, любые предложения?

clang++ -Wall -Wextra -g -std=c++11 lzwtest.cpp -o lzwtest dict;
Project Compilation
.
.
.
.
.
Compiling CPP file lzwtest.cpp ...
In file included from lzwtest.cpp:2:
In file included from ./LZW.h:23:
In file included from ./ctrie_int.h:36:
./ctrie_int.ii:7:1: error: unknown type name 'Trie_Int'
Trie_Int * newTrie_Int(int defVal){return new Trie<int>(defVal);}
^
./ctrie_int.ii:7:43: error: cannot initialize return object of type 'int *' with an rvalue of type 'Trie<int> *'
Trie_Int * newTrie_Int(int defVal){return new Trie<int>(defVal);}
                                          ^~~~~~~~~~~~~~~~~~~~~
./ctrie_int.ii:9:21: error: unknown type name 'Trie_Int'
void deleteTrie_Int(Trie_Int * trie){delete ((Trie<int> *)trie);}
                    ^
./ctrie_int.ii:11:19: error: unknown type name 'Trie_Int'
int Trie_Int_size(Trie_Int * t){return ((Trie<int> *)t)->size();}
                  ^
./ctrie_int.ii:13:30: error: unknown type name 'Trie_Int'
int Trie_Int_getDefaultValue(Trie_Int * t){return ((Trie<int> *)t)->getDefaultValue();}
                             ^
./ctrie_int.ii:15:23: error: unknown type name 'Trie_Int'
int Trie_Int_contains(Trie_Int * t,const char * key){return ((Trie<int> *)t)->contains(key); }
                      ^
./ctrie_int.ii:17:18: error: unknown type name 'Trie_Int'
int Trie_Int_get(Trie_Int * t,char * key){return ((Trie<int> *)t)->get(key); }
                 ^
./ctrie_int.ii:19:19: error: unknown type name 'Trie_Int'
void Trie_Int_put(Trie_Int * t,char * s,int val){ ((Trie<int> *)t)->put(s,val);}
                  ^
./ctrie_int.ii:21:37: error: unknown type name 'Trie_Int'
const char * Trie_Int_longestPrefix(Trie_Int * t,char * s){return  ((Trie<int> *)t)->longestPrefix(s).c_str();}
                                    ^
./ctrie_int.ii:23:23: error: unknown type name 'Trie_Int'
int Trie_Int_compress(Trie_Int * t){return  ((Trie<int> *)t)->compress();}
                      ^
10 errors generated.

Ниже заголовок для включенного файла

ctrie_int.h

#ifndef COM_WORDGAME_UTILITY_CTRIE_H
#define COM_WORDGAME_UTILITY_CTRIE_H

#ifdef __cplusplus
extern "C"{ //this is used to identify following code as C specific code which will enforce C style name mangling
#endif

//Declare a new void Type To Emulate C class
typedef void Trie_Int;
...Removed in attempt to shorten Question
#ifdef __cplusplus
}
#endif

#endif

Этот файл использует предыдущий, но даже простой код, или просто включение файла заголовка последнего вызывает ошибку, описанную в начале

#ifndef COM_WORDGAME_UTILITY_CTRIE_H
#define COM_WORDGAME_UTILITY_CTRIE_H

#ifdef __cplusplus
extern "C"{ //this is used to identify following code as C specific code which will enforce C style name mangling
#endif

void compress(char src[],char dst[]);

void decompress(char src[],char dst[]);

#ifdef __cplusplus
}
#endif

#endif

//BELOW CODE WILL BE ADDED IN ANOTHER FILE

#include <stdio.h>
#include <stdlib.h>
#include "ctrie_int.h" // This causes an issue cannot find Trie_Int the functions return an odd message describing the Trie_Int was defered to an actual pointer integer

для ясности первые несколько строк ctrie.ii выглядят так

//#include "ctrie_int.h" //Should not be included would create cycle since ctrie_int.h declares it at the final line 
#include "Trie.hpp" //C++ code
//THIS HAS TO BE COMPILED WITH C++ COMPILER TO BE COMPILED PROPERLY ANYWAY GAURDS UNEEDED
extern "C"{
//Create new Trie_Int Object
Trie_Int * newTrie_Int(int defVal){return new Trie<int>(defVal);}
....Removed In Attempt to shorten question
}
  • 2
    Проверьте, что / как / когда на самом деле включено. Я почти уверен, что ваш заголовок не был включен.
  • 0
    Я понял, но когда я добавляю #include "ctrie_int.h" в другой файл и проверяю все их функции, он работает нормально. Однако, когда я добавляю его в определение заголовка, это вызывает проблемы ... Я просто решил попытаться объявить и определить функции в одном и том же файле, поэтому включения находятся в конце заголовочного файла.
Теги:
typename

1 ответ

1
Лучший ответ

Ключ находится на первых этапах сообщения об ошибке:

Compiling CPP file lzwtest.cpp ...
In file included from lzwtest.cpp:2:
In file included from ./LZW.h:23:
In file included from ./ctrie_int.h:36:                     <<< Here
./ctrie_int.ii:7:1: error: unknown type name 'Trie_Int'

Похоже, что файл ctrie_int.ii включен из вашего заголовка до Trie_Int как был определен Trie_Int.

  • 0
    хм, что кажется странным, ctrie_int.ii на самом деле определяет функции в ctri_int.h, и у меня изначально это было #include в конце заголовочного файла, что на самом деле и является строкой 36, прежде чем я разобрал все на части, пытаясь это исправить. Есть ли у них какая-либо причина, по которой добавление файла ctrie_int.h в файл определения другого заголовка может привести к странному порядку включений, а не к нормальной работе простого тестового файла для проверки функций?
  • 1
    Как выглядят первые несколько строк ctrie_int.ii ? Возможно, вы могли бы опубликовать это в своем вопросе.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню