2010-07-28 3 views
0

Это странно. Я создал вектор просто отлично в одном классе, но не могу создать его в другом классе. Он представление о том, что у меня есть:C++ не может создать вектор

main.h

#include <Windows.h> 
#include <ShellAPI.h> 
#include <vector> 
#include <string> 
#include <iostream> 

#include "taco.h" 

class MyClass 
{ 

public: 
    int someint; 
    vector<int> myOrder; 
}; 

taco.h

#include <vector> 

class OtherClass 
{ 

public: 
    vector<int> otherOrder; 
}; 

И я получаю ошибки компиляции относительно вектора декларации в taco.h:

error C2143: syntax error : missing ';' before '<' 
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
error C2238: unexpected token(s) preceding ';' 

Что мне здесь недостает? Я могу раскомментировать эту вторую декларацию вектора, и она отлично компилируется.

+4

Это говорит мне, что некоторые .h файл 'используя патезрасе,' в нем где-то, что, как правило, плохая идея. 'использование' никогда не должно выполняться в заголовках, поскольку оно испортит пространства имен для любого .cpp-файла, который прямо или косвенно включает этот заголовок. Оставьте 'использование' только для исходных файлов, где эффекты локальны. –

ответ

11

Try:

std::vector<int> otherOrder; 

vector является частью std пространства имен. Это означает, что всякий раз, когда вы используете vector в файле заголовка, вы должны включить префикс std::.

Причина, по которой вы можете иногда уйти с забыванием, заключается в том, что некоторые из них могут содержать using namespace std;, что позволяет вам оставить префикс. Однако вам следует избегать ключевое слово using в файлах заголовков, поскольку оно будет загрязнять пространство имен любых файлов, которое include.

Для более подробного объяснения опасностей using namespace ..., см. this thread.

+1

[Этот ответ] (http://stackoverflow.com/questions/2879555/c-stl-how-to-write-wrappers-for-cout-cerr-cin-and-endl/2880136#2880136) является еще одним аргументом против 'using namespace std'. – sbi

+0

@sbi: Спасибо, хороший аргумент. –

+0

Хммм почему-то я думал, что мой «использование пространства имен std» в main.h каскадируется до taco.h. Спасибо за ответ! –

3

Пробег: std::vector<int>. Вы должны использовать пространство имен --- Я предполагаю, что у вас есть

using namespace std; 

в main.h где-нибудь. Там много разговоров о том, почему использование using - это плохая практика; Я бы рекомендовал вам проверить это.

3

Все объекты стандартной библиотеки C++ живут в пространстве имен std. Попробуйте

class MyClass 
{ 

public: 
    int someint; 
    std::vector<int> myOrder; 
// ^^^^^ 
};