Вопрос C ++ ... определение не распознает векторы, указанные в объявлении - PullRequest
0 голосов
/ 11 мая 2009

Я работаю над заданием класса, которое началось с малого, поэтому у меня все было в одном файле. Теперь он стал больше, и я пытаюсь отдельно скомпилировать main, функции и классы (поэтому все классы объединены в один .h и один .cpp). У меня есть один класс B, который является родителем для многих других и идет первым в файле. Один из его членов данных не работает сейчас, когда я использую отдельную компиляцию, которая вызывает десятки ошибок.

В .ч

class A;
class B {
public: 
    B (){}
    A* myptr;
    void whatever();
    vector<A*> myAs; //this one is the problem
};

In .cpp

void B::whatever() {
    vector<A*> newvector; //no problem!
    myptr = &something; //no problem!
    for (vector<A*>::iterator iter = myAs.begin(); iter != myAs.end(); ++iter) {
        //error!
    }
}

Я получаю ошибки: либо «myAs не был объявлен в этой области», либо «класс B не имеет члена myAs».

Я включил , объявленный заранее класс A, как вы видите выше, и я определенно не забыл включить .h в начало .cpp! Есть ли что-то о векторах или классах и отдельной компиляции, которые я не понимаю? Это в Xcode, кстати.

1 Ответ

5 голосов
/ 11 мая 2009

Это не просто vector. Это std::vector, потому что оно находится внутри пространства имен, называемого std. Вот почему стонет компилятор. Он не знает, что означает vector<A*>. Скажите std::vector<A*> вместо.

Do not добавьте using namespace std; теперь в заголовок из-за этого. Это может быть хорошо для назначения, чтобы поместить его в файл .cpp, чтобы сохранить набор текста, если вы хотите. Но вставлять такую ​​строку в заголовок - очень плохая идея: потому что вы не знаете, каким файлам понадобится заголовок в будущем. Ситуация может быстро выйти из-под контроля, так как количество файлов, включая ваш заголовок, со временем растет. Поэтому заголовок должен включать только те имена и заголовки, которые ему действительно необходимы, чтобы он вызывал как можно меньше конфликтов имен - тогда как эта строка using namespace std; сделает все имена std видимыми напрямую.

...