2012-01-03 2 views
3

У меня есть файл с именем test1.cppC++ имен из другого исходного файла

namespace a { 
int main1() { 
    return 3; 
} 
} 

И у меня есть еще один файл test2.cpp

#include <stdio.h> 
using a::main1; 
int main() { 
    printf("%d", a::main1()); 
} 

Затем я получил ошибку компиляции, говоря 'a' has not been declared с г ++. Пожалуйста, помогите мне узнать, что я пропустил здесь, и обычно, как это сделать.

спасибо.

ответ

4

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

+0

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

1

Вам необходимо объявить ваш a :: main1 в файле заголовка, назовите его test1.h, а затем включите этот заголовок в test2.h. В противном случае test2 не имеет возможности узнать, что вы расширили в test1.

test1.h

namespace a { 
int main1(); 
} 

test1.cpp

namespace a { 
int main1() { 
    return 3; 
} 
} 

test2.cpp

#include <stdio.h> 
#include test1.h 
using a::main1; 
int main() { 
    printf("%d", a::main1()); 
} 
0

Ваша функция main1() объявляется в пространстве имен 'а', так что, когда вы звоните в файле printf() вам нужно убедиться, что компилятор знает, какое пространство имен будет искать его. два способа сделать это (что я знаю):

  1. Вы можете явно вызвать из пространства имен с помощью ::, как вы делали:

    printf ("%d", a::main1()); 
    
  2. Или вы можете, где-то наверху это первый использовать, скажите компилятор обычно ищет символы в «а» пространство имен, используя строку:

    using namespace a; 
    

Компилятор, который я использую (MS Studio 2008), не жаловался, когда я использовал оба метода вместе.

Я верю, что причина, по которой вы сделали ошибку, заключалась в том, что ваш оператор «using» был неправильно сформирован для компилятора (см. Выше).

+0

уверен, что его проблема в том, что test2 не включает test1, поэтому пространство имен неизвестно? – StevieG

+0

Нет. Остальные два ответа (с этого момента) пропускают отметку (на самом деле тот, который включает код, не будет компилироваться без ошибок). ПРОБЛЕМА Операция «использование» неверна. Никакие компиляторы C/C++ (которые, как я знаю) не заботятся о том, что-то находится в заголовке или файле cpp, он просто должен уметь видеть и анализировать его в соответствии с языковыми правилами. Однако я согласен с тем, что, как правило, лучше всего объявлять вещи в заголовках - сохраняет хорошо организованные и, следовательно, поддерживаемые. –