2010-12-15 1 views
0

Я верю, что выкопал себя в отверстие. Разбирая мой единственный файл, пару тысяч строк кода в несколько файлов, я, кажется, грубо накрутил структуру программы.
Я новичок в C++ и его заголовочных файлах и управлении пространством имен, поэтому я учился, когда я ухожу. Я догадываюсь, что я не совсем понимаю, как # включать, использовать и пространства имен взаимосвязаны и что переносится на другие файлы и т. Д.Зависимости, пространство имен и заголовки

Чтение через документацию MSDN Я могу видеть кусочки моей проблемы, но решение ускользает от меня , В настоящее время у меня есть четыре .cpp файлы и заголовки:


1) A Главный Файл

2) GameData .cpp и его заголовок, который содержится в пространстве имен PDATA

3) A GameSettings .cpp и его заголовок, который содержится в пространстве имен pSettings

4) GeneralScreens .cpp и его заголовок, который содержится в пространстве имен pScreens


После компиляции отладчик извергает более 100 ошибок, как:

>c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(454): error C2447: '{' : missing function header (old-style formal list?) 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(463): error C2039: 'pair' : is not a member of 'std' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(463): error C2955: 'pScreens::std::pair' : use of class template requires template argument list 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(173) : see declaration of 'pScreens::std::pair' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(33): error C2873: 'wcsrtombs' : symbol cannot be used in a using-declaration 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(41): error C2039: 'wctob' : is not a member of '`global namespace'' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(41): error C2873: 'wctob' : symbol cannot be used in a using-declaration 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(42): error C2039: 'wmemchr' : is not a member of '`global namespace'' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(42): error C2873: 'wmemchr' : symbol cannot be used in a using-declaration 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(42): error C2039: 'wmemcmp' : is not a member of '`global namespace'' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(42): error C2873: 'wmemcmp' : symbol cannot be used in a using-declaration 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(42): error C2039: 'wmemcpy' : is not a member of '`global namespace'' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(42): error C2873: 'wmemcpy' : symbol cannot be used in a using-declaration 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(43): error C2039: 'wmemmove' : is not a member of '`global namespace'' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\new(93): error C2039: 'nothrow_t' : is not a member of 'std' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\new(93): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\new(93): error C2143: syntax error : missing ',' before '&' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\new(99): error C2039: 'new_handler' : is not a member of 'std' 

ли эти ошибки свидетельствуют о чем-то?

Я предполагаю, что что-то не так с тем, как я ссылаюсь на библиотеку std, хотя я не знаю, как точно определить ошибку, потому что все ошибки находятся в библиотечных файлах.

+1

Какая минимальная сумма кода вызывает эту проблему? – 2010-12-15 19:43:23

+0

Минимальный образец кода поможет чрезвычайно. Кроме того, вы можете искать MSDN для кодов ошибок: каждая страница кода ошибки дает примеры того, что может вызвать ее, поэтому вы можете сравнить свой код с ними. – suszterpatt 2010-12-15 19:49:04

ответ

3

Скорее всего, вам не хватает точки с запятой в конце, если определение класса или структуры в файле заголовка. Затем компилятор обрабатывает каждый идентификатор, который он видит как экземпляр этого класса, а не то, что вы ожидаете. Затем компилятор жалуется, потому что не знает, что делать с блуждающим {} s, который он видит.

Отметьте заголовок #include d перед <utility> в вашем файле реализации; этот заголовок, скорее всего, там, где ошибка.

Сторона примечания: Чтобы избежать этой проблемы, всегда указывайте стандартные заголовки перед своими собственными заголовками в файле .CPP. Например, вместо

// MyGameThing.cpp 
#include "MyGameThing.hpp" 
#include <utility> 
#include <string> 

// code 

сделать

// MyGameThing.cpp 
#include <utility> 
#include <string> 
#include "MyGameThing.hpp" 

// code 

Таким образом, вы не получите ошибки компиляции, как это утопает в стандартных заголовков.

+0

одна вещь, хотя я никогда не включал Утилиту, должен ли я просто искать библиотеку, которая имеет это как зависимость? – Fuller 2010-12-15 19:52:09

+0

Спасибо за подсказку в файле заголовка тоже, мне было интересно, что – Fuller 2010-12-15 19:52:29

+0

@Fuller: `` включен в несколько мест (а именно потому, что он содержит `std :: pair`, который используется для таких вещей, как` std :: map`). Измените свои заказы на участие и проверьте свои заголовки на отсутствие точек с запятой. – 2010-12-15 19:55:30

0

Если вы используете Visual C++, откройте первый файл cpp и нажмите CTRL + F7, это скомпилирует только файл cpp, проверит первую ошибку и попытается исправить это. При фиксированном переходе в следующий файл cpp, если ошибка сохраняется.

3

Первая ошибка компилятора будет ваш лучший ключ:

C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ Include \ утилиты (454): ошибка C2447: «{ ': отсутствует заголовок функции (формальный список старого стиля?)

Я предполагаю, что здесь происходит то, что у вас может быть объявление класса или структуры без конечной точки с запятой. Так что у вас есть что-то вроде этого:

struct Foo 
{ 
} // <--- no semicolon here will generate funky errors 

Но в целом, обратить пристальное & особого внимания на первую ошибку компилятора.

Как @Billy упоминает в комментариях ниже, правила для struct и class одинаковы. В любом случае вам нужна точка с запятой. Кроме того, старая школа код C часто определение типа во как это структурах:

typedef struct tag_Foo 
{ 
} Foo; // <-- still need the semicolon 

Здесь вы еще нужна точка с запятой.

0

Попытка Билли является достойной, но обычный ответ на недостающий ';' для компилятора сказать так. Отсутствие «}» с другой стороны может серьезно запутать стандартные заголовки, включенные впоследствии, потому что все их содержимое находится в пределах пространства имен или класса, которые должны были быть закрыты. Также, ';' отсутствует, то сразу обнаруживается, в то время как отсутствующий «}» не обязательно является ошибкой, поэтому компилятор просто разбирает соответствие первой вещи, которая не имеет смысла в этой области.

Кроме того, в строке 454 в утилите для компилятора 2010 находится открывающая скобка для специализации tuple_size для std :: pair. Сообщение препроцессор это определение будет выглядеть так:

template <...> 
struct tuple_size< ::std::pair<_Ty1, _Ty2> > 

Если вы забыли «}» закрыть пространство имен, то это не там, где pair<> существует больше. Вместо этого, так как он объявлен так:

namespace std { template <...> struct pair ... } 

Независимо сфера не была закрыта теперь, когда std в настоящее время объявлен и struct tuple_size< ::std::pair<...> > не имеет никакого смысла для синтаксического анализатора. Так как это недопустимое имя, оно имеет тенденцию притворяться, что оно даже не существует, а затем «{» в глобальном масштабе без какого-либо смысла, прежде чем оно будет довольно запутанным.

BTW, часто негласное преимущество создания минимальных примеров, которые вызывают проблему, заключается в том, что вы в конечном итоге НАЙТИ проблему, которая пытается это сделать.