Объект не объявлен в области - PullRequest
0 голосов
/ 08 марта 2010

Я использую Xcode для C ++ на моем компьютере, когда я использую Visual Studio в школе. Следующий код прекрасно работал в Visual Studio, но у меня возникла эта проблема при использовании Xcode.

clock c1(2, 3, 30);

Все работает просто отлично, но продолжает выдавать мне ошибку с надписью «Ожидается»; до 'c1' "

Хорошо, я поставил ';' .. но тогда, это дает мне эту ошибку: "'c1' не был объявлен в этой области"

Вот весь код заголовка:

#include <iostream>
using namespace std;

class clock
{
private:
 int h;
 int m;
 int s;

public: 
 clock(int hr, int mn, int sec);
};

clock::clock(int hr, int mn, int sec)
{
 h = hr;
 m = mn; 
 s = sec;
}

Вот весь код .cpp:

#include "clock.h"

int main()
{
    clock c1(2, 3, 30);
    return 0;
}

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

Заранее спасибо!

Ответы [ 3 ]

6 голосов
/ 08 марта 2010

Существует функция clock, которая будет скрывать ваш clock класс с тем же именем. Вы можете обойти это, сказав

class clock c1(2, 3, 30);

Это очень плохая практика - делать using namespace std; в заголовке. Вместо этого поместите эту строку только в файл cpp. Это может решить вашу проблему, если вы удалите эту строку (если имя происходит из пространства имен std:: вместо первоначально из глобального пространства имен).

4 голосов
/ 08 марта 2010

Ваше определение класса часов конфликтует с clock_t clock() из <ctime> (см. здесь ).

Вы можете обойти это, указав, что вам нужен класс, а не функция, как описано Йоханнесом, но на самом деле вы должны просто переименовать свой класс, чтобы он не конфликтовал со стандартной функцией. Это наиболее практичное решение.

Просто чтобы повторить то, что сказал Йоханнес, не помещайте using namespace std; в заголовок. Это приводит к тому, что пространство имен std внедряется в каждый файл, содержащий ваш заголовок, что в какой-то момент неизбежно приведет к конфликтам идентификаторов. Если вам это действительно нужно, но только в исходном файле, поскольку это ничего не включает.

0 голосов
/ 08 марта 2010

Вы должны поместить свой класс clock в пространство имен, чтобы он не конфликтовал с clock().

Хорошо сделано, чтобы вычистить все остальное, прежде чем задавать вопрос.

Так как вы удалили много вещей, вы снова вернете их обратно. Возможны и другие проблемы:

  • Как уже говорили другие: не ставьте using namespace std; в заголовке.
  • Вам понадобятся охранники, если вы их еще не получили.
  • Вы должны переместить реализацию конструктора обратно в файл модуля или сделать его встроенным, потому что компоновщик будет жаловаться.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...