Зависимости, пространство имен и заголовки - PullRequest
0 голосов
/ 15 декабря 2010

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

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


1) Основной файл

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

3). 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, хотя я не знаю, как точно определить ошибку, поскольку все ошибки находятся в файлах библиотеки.

Ответы [ 4 ]

3 голосов
/ 15 декабря 2010

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

c: \ program files (x86) \ microsoft visual studio 10.0 \ vc \ include \ utility (454): ошибка C2447:'{': отсутствует заголовок функции (формальный список в старом стиле?)

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

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

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

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

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

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

3 голосов
/ 15 декабря 2010

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

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

Примечание: во избежание этой проблемы всегда #include стандартных заголовков перед вашими собственными заголовками в файле .CPP.Например, вместо

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

// code

do

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

// code

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

0 голосов
/ 15 декабря 2010

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

Кроме того, в строке 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<...> > не имеет никакого смысла для синтаксического анализатора. Поскольку это недопустимое имя, оно, как правило, притворяется, что его тут же нет, а затем «{» в глобальном масштабе без какого-либо смысла, прежде чем это будет довольно странно.

Кстати, часто невысказанное преимущество создания минимальных примеров, вызывающих проблему, состоит в том, что вы в конечном итоге НАХОДИТЕ проблему, пытаясь ее осуществить.

0 голосов
/ 15 декабря 2010

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

...